diff options
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/core/arrayprint.py | 11 | ||||
-rw-r--r-- | numpy/core/code_generators/generate_numpy_api.py | 2 | ||||
-rw-r--r-- | numpy/core/include/numpy/ndarrayobject.h | 2 | ||||
-rw-r--r-- | numpy/core/numerictypes.py | 16 | ||||
-rw-r--r-- | numpy/core/src/multiarray/arraytypes.c.src | 33 | ||||
-rw-r--r-- | numpy/core/src/multiarray/descriptor.c | 3 | ||||
-rw-r--r-- | numpy/core/src/multiarray/multiarraymodule.c | 6 | ||||
-rw-r--r-- | numpy/core/src/multiarray/scalartypes.c.src | 6 |
8 files changed, 57 insertions, 22 deletions
diff --git a/numpy/core/arrayprint.py b/numpy/core/arrayprint.py index a3edb64d4..6d3c52990 100644 --- a/numpy/core/arrayprint.py +++ b/numpy/core/arrayprint.py @@ -188,10 +188,13 @@ def _array2string(a, max_line_width, precision, suppress_small, separator=' ', # make sure True and False line up. format_function = _boolFormatter elif issubclass(dtypeobj, _nt.integer): - max_str_len = max(len(str(maximum.reduce(data))), - len(str(minimum.reduce(data)))) - format = '%' + str(max_str_len) + 'd' - format_function = lambda x: _formatInteger(x, format) + if issubclass(dtypeobj, _nt.timeinteger): + format_function = str + else: + max_str_len = max(len(str(maximum.reduce(data))), + len(str(minimum.reduce(data)))) + format = '%' + str(max_str_len) + 'd' + format_function = lambda x: _formatInteger(x, format) elif issubclass(dtypeobj, _nt.floating): if issubclass(dtypeobj, _nt.longfloat): format_function = _longfloatFormatter(precision) diff --git a/numpy/core/code_generators/generate_numpy_api.py b/numpy/core/code_generators/generate_numpy_api.py index ca702a06a..509048471 100644 --- a/numpy/core/code_generators/generate_numpy_api.py +++ b/numpy/core/code_generators/generate_numpy_api.py @@ -2,7 +2,7 @@ import os import genapi types = ['Generic','Number','Integer','SignedInteger','UnsignedInteger', - 'Inexact', + 'Inexact', 'TimeInteger', 'Floating', 'ComplexFloating', 'Flexible', 'Character', 'Byte','Short','Int', 'Long', 'LongLong', 'UByte', 'UShort', 'UInt', 'ULong', 'ULongLong', 'Float', 'Double', 'LongDouble', diff --git a/numpy/core/include/numpy/ndarrayobject.h b/numpy/core/include/numpy/ndarrayobject.h index a8b4e160a..8d0e444a2 100644 --- a/numpy/core/include/numpy/ndarrayobject.h +++ b/numpy/core/include/numpy/ndarrayobject.h @@ -592,7 +592,7 @@ typedef struct { } npy_timedeltastruct; -#define PyDataType_GetDatetimeMetaData(descr) (descr->metadata == NULL ? NULL : ((PyArray_DatetimeMetaData *)(PyCObject_AsVoidPtr(PyDict_GetItemString((descr->metadata, NPY_METADATA_DTSTR)))))) +#define PyDataType_GetDatetimeMetaData(descr) ((descr->metadata == NULL) ? NULL : ((PyArray_DatetimeMetaData *)(PyCObject_AsVoidPtr(PyDict_GetItemString(descr->metadata, NPY_METADATA_DTSTR))))) typedef int (PyArray_FinalizeFunc)(PyArrayObject *, PyObject *); diff --git a/numpy/core/numerictypes.py b/numpy/core/numerictypes.py index 24c88aaf6..c72cc122a 100644 --- a/numpy/core/numerictypes.py +++ b/numpy/core/numerictypes.py @@ -32,10 +32,13 @@ Exported symbols include: int_, uint, longlong, ulonglong, + single, csingle, float_, complex_, longfloat, clongfloat, + datetime, timedelta, (these inherit from timeinteger which inherits from signedinteger) + As part of the type-hierarchy: xx -- is bit-width @@ -87,7 +90,6 @@ import types as _types # as numerictypes.bool, etc. from __builtin__ import bool, int, long, float, complex, object, unicode, str - # String-handling utilities to avoid locale-dependence. # "import string" is costly to import! @@ -626,27 +628,25 @@ typecodes = {'Character':'c', 'Complex':'FDG', 'AllInteger':'bBhHiIlLqQpP', 'AllFloat':'fdgFDG', - 'Datetime': 'Tt', - 'All':'?bhilqpBHILQPfdgFDGSUVOTt'} + 'Datetime': 'Mm', + 'All':'?bhilqpBHILQPfdgFDGSUVOMm'} # backwards compatibility --- deprecated name typeDict = sctypeDict typeNA = sctypeNA -# FIXME: Decide how T and t need to be integrated here. - # b -> boolean # u -> unsigned integer # i -> signed integer # f -> floating point # c -> complex -# T -> datetime -# t -> timedelta +# M -> datetime +# m -> timedelta # S -> string # U -> Unicode string # V -> record # O -> Python object -_kind_list = ['b', 'u', 'i', 'f', 'c', 'S', 'U', 'V', 'O'] +_kind_list = ['b', 'u', 'i', 'f', 'c', 'S', 'U', 'V', 'O', 'M', 'm'] __test_types = typecodes['AllInteger'][:-2]+typecodes['AllFloat']+'O' __len_test_types = len(__test_types) diff --git a/numpy/core/src/multiarray/arraytypes.c.src b/numpy/core/src/multiarray/arraytypes.c.src index 49f9cceaf..7080fbe7a 100644 --- a/numpy/core/src/multiarray/arraytypes.c.src +++ b/numpy/core/src/multiarray/arraytypes.c.src @@ -198,6 +198,7 @@ NPY_NO_EXPORT PyObject * PyDateTime_FromInt64(datetime val, PyArray_Descr *descr) { PyArray_DatetimeMetaData *meta; + meta = PyDataType_GetDatetimeMetaData(descr); if (meta == NULL) { PyErr_SetString(PyExc_RuntimeError, "metadata not set for descriptor"); @@ -346,7 +347,7 @@ PyDateTime_AsInt64(PyObject *obj, PyArray_Descr *descr) meta = PyDataType_GetDatetimeMetaData(descr); if (meta == NULL) { PyErr_SetString(PyExc_RuntimeError, "metadata not set for descriptor"); - return NULL; + return -1; } @@ -378,7 +379,7 @@ PyTimeDelta_AsInt64(PyObject *obj, PyArray_Descr *descr) meta = PyDataType_GetDatetimeMetaData(descr); if (meta == NULL) { PyErr_SetString(PyExc_RuntimeError, "metadata not set for descriptor"); - return NULL; + return -1; } if (meta->events > 1) { @@ -2965,6 +2966,25 @@ NPY_NO_EXPORT PyArray_Descr @from@_Descr = { /**end repeat**/ +static void +_init_datetime_descr(PyArray_Descr *descr) +{ + PyArray_DatetimeMetaData *dt_data; + PyObject *cobj; + + dt_data = _pya_malloc(sizeof(PyArray_DatetimeMetaData)); + dt_data->base = NPY_FR_us; + dt_data->num = 1; + dt_data->den = 1; + dt_data->events = 1; + + cobj = PyCObject_FromVoidPtr((void *)dt_data, _pya_free); + descr->metadata = PyDict_New(); + PyDict_SetItemString(descr->metadata, NPY_METADATA_DTSTR, cobj); + Py_DECREF(cobj); + +} + #define _MAX_LETTER 128 static char _letter_to_num[_MAX_LETTER]; @@ -3045,6 +3065,14 @@ PyArray_DescrFromType(int type) else { Py_INCREF(ret); } + + /* Make sure dtype metadata is initialized for DATETIME */ + if (PyTypeNum_ISDATETIME(type)) { + if (ret->metadata == NULL) { + _init_datetime_descr(ret); + } + } + return ret; } @@ -3176,6 +3204,7 @@ set_typeinfo(PyObject *dict) SETTYPE(Integer); SETTYPE(Inexact); SETTYPE(SignedInteger); + SETTYPE(TimeInteger); SETTYPE(UnsignedInteger); SETTYPE(Floating); SETTYPE(ComplexFloating); diff --git a/numpy/core/src/multiarray/descriptor.c b/numpy/core/src/multiarray/descriptor.c index 001617364..c112c8711 100644 --- a/numpy/core/src/multiarray/descriptor.c +++ b/numpy/core/src/multiarray/descriptor.c @@ -1327,8 +1327,9 @@ PyArray_DescrNew(PyArray_Descr *base) Py_INCREF(new->subarray->shape); Py_INCREF(new->subarray->base); } - Py_XINCREF(new->typeobj); + Py_XINCREF(new->typeobj); Py_XINCREF(new->metadata); + return new; } diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c index 5f8055438..6f9c34313 100644 --- a/numpy/core/src/multiarray/multiarraymodule.c +++ b/numpy/core/src/multiarray/multiarraymodule.c @@ -2585,8 +2585,10 @@ setup_scalartypes(PyObject *NPY_UNUSED(dict)) #else SINGLE_INHERIT(LongLong, SignedInteger); #endif - SINGLE_INHERIT(Datetime, SignedInteger); - SINGLE_INHERIT(Timedelta, SignedInteger); + + SINGLE_INHERIT(TimeInteger, SignedInteger); + SINGLE_INHERIT(Datetime, TimeInteger); + SINGLE_INHERIT(Timedelta, TimeInteger); /* fprintf(stderr, diff --git a/numpy/core/src/multiarray/scalartypes.c.src b/numpy/core/src/multiarray/scalartypes.c.src index 861cf0c99..28ba7f47a 100644 --- a/numpy/core/src/multiarray/scalartypes.c.src +++ b/numpy/core/src/multiarray/scalartypes.c.src @@ -32,9 +32,9 @@ NPY_NO_EXPORT PyBoolScalarObject _PyArrayScalar_BoolValues[] = { /**begin repeat * #name = number, integer, signedinteger, unsignedinteger, inexact, - * floating, complexfloating, flexible, character# + * floating, complexfloating, flexible, character, timeinteger# * #NAME = Number, Integer, SignedInteger, UnsignedInteger, Inexact, - * Floating, ComplexFloating, Flexible, Character# + * Floating, ComplexFloating, Flexible, Character, TimeInteger# */ NPY_NO_EXPORT PyTypeObject Py@NAME@ArrType_Type = { PyObject_HEAD_INIT(NULL) @@ -3015,7 +3015,7 @@ initialize_numeric_types(void) /**begin repeat * #NAME= Number, Integer, SignedInteger, UnsignedInteger, Inexact, - * Floating, ComplexFloating, Flexible, Character# + * Floating, ComplexFloating, Flexible, Character, TimeInteger# */ Py@NAME@ArrType_Type.tp_flags = BASEFLAGS; /**end repeat**/ |