summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/defchararray.py2
-rw-r--r--numpy/core/ma.py18
-rw-r--r--numpy/core/numerictypes.py38
-rw-r--r--numpy/core/oldnumeric.py2
-rw-r--r--numpy/core/src/arrayobject.c74
-rw-r--r--numpy/core/src/umathmodule.c.src35
-rw-r--r--numpy/lib/getlimits.py2
-rw-r--r--numpy/lib/type_check.py8
-rw-r--r--numpy/lib/utils.py8
9 files changed, 114 insertions, 73 deletions
diff --git a/numpy/core/defchararray.py b/numpy/core/defchararray.py
index 6b43d7f6f..70096441c 100644
--- a/numpy/core/defchararray.py
+++ b/numpy/core/defchararray.py
@@ -1,5 +1,5 @@
from numerictypes import character, string, unicode_, \
- obj2dtype, integer, object_
+ integer, object_
from numeric import ndarray, broadcast, empty
from numeric import array as narray
import sys
diff --git a/numpy/core/ma.py b/numpy/core/ma.py
index c736b3e34..27831fdde 100644
--- a/numpy/core/ma.py
+++ b/numpy/core/ma.py
@@ -545,14 +545,16 @@ class MaskedArray (object):
"""array(data, dtype=None, copy=True, fortran=False, mask=nomask, fill_value=None)
If data already a numeric array, its dtype becomes the default value of dtype.
"""
- tc = dtype
+ if dtype is None:
+ tc = None
+ else:
+ tc = numeric.dtype(dtype)
need_data_copied = copy
if isinstance(data, MaskedArray):
c = data.data
- ctc = c.dtype.char
if tc is None:
- tc = ctc
- elif dtype2char(tc) != ctc:
+ tc = c.dtype
+ elif tc != c.dtype:
need_data_copied = True
if mask is nomask:
mask = data.mask
@@ -561,17 +563,17 @@ class MaskedArray (object):
elif isinstance(data, ndarray):
c = data
- ctc = c.dtype.char
if tc is None:
- tc = ctc
- elif dtype2char(tc) != ctc:
+ tc = c.dtype
+ elif tc != c.dtype:
need_data_copied = True
else:
need_data_copied = False #because I'll do it now
c = numeric.array(data, dtype=tc, copy=True, fortran=fortran)
+ tc = c.dtype
if need_data_copied:
- if tc == ctc:
+ if tc == c.dtype:
self._data = numeric.array(c, dtype=tc, copy=True, fortran=fortran)
else:
self._data = c.astype(tc)
diff --git a/numpy/core/numerictypes.py b/numpy/core/numerictypes.py
index 1955c370a..1ca432883 100644
--- a/numpy/core/numerictypes.py
+++ b/numpy/core/numerictypes.py
@@ -78,7 +78,7 @@ $Id: numerictypes.py,v 1.17 2005/09/09 22:20:06 teoliphant Exp $
"""
# we add more at the bottom
-__all__ = ['typeDict', 'typeNA', 'arraytypes', 'ScalarType', 'obj2dtype', 'cast', 'nbytes', 'dtype2char']
+__all__ = ['typeDict', 'typeNA', 'arraytypes', 'ScalarType', 'obj2arrtype', 'cast', 'nbytes', 'arrtype2char','maximum_arrtype', 'isarrtype']
from multiarray import typeinfo, ndarray, array, empty
import types as _types
@@ -226,13 +226,13 @@ def _set_up_aliases():
_set_up_aliases()
# Now, construct dictionary to lookup character codes from types
-_dtype2char_dict = {}
+_arrtype2char_dict = {}
def _construct_char_code_lookup():
for name in typeinfo.keys():
tup = typeinfo[name]
if isinstance(tup, tuple):
if tup[0] not in ['p','P']:
- _dtype2char_dict[tup[-1]] = tup[0]
+ _arrtype2char_dict[tup[-1]] = tup[0]
_construct_char_code_lookup()
@@ -271,9 +271,9 @@ genericTypeRank = ['bool', 'int8', 'uint8', 'int16', 'uint16',
'complex32', 'complex64', 'complex128', 'complex160',
'complex192', 'complex256', 'complex512', 'object']
-def maximum_dtype(t):
- """returns the type of highest precision of the same general kind as 't'"""
- g = obj2dtype(t)
+def maximum_arrtype(t):
+ """returns the arrtype of highest precision of the same general kind as 't'"""
+ g = obj2arrtype(t)
if g is None:
return t
t = g
@@ -298,16 +298,16 @@ def _python_type(t):
t = type(t)
return allTypes[_python_types.get(t, 'object_')]
-def isdtype(rep):
+def isarrtype(rep):
"""Determines whether the given object represents
a numeric array type."""
try:
- char = dtype2char(rep)
+ char = arrtype2char(rep)
return True
except (KeyError, ValueError):
return False
-def obj2dtype(rep, default=None):
+def obj2arrtype(rep, default=None):
try:
if issubclass(rep, generic):
return rep
@@ -321,10 +321,10 @@ def obj2dtype(rep, default=None):
return res
-# This dictionary allows look up based on any alias for a type
+# This dictionary allows look up based on any alias for an array type
class _typedict(dict):
def __getitem__(self, obj):
- return dict.__getitem__(self, obj2dtype(obj))
+ return dict.__getitem__(self, obj2arrtype(obj))
nbytes = _typedict()
_alignment = _typedict()
@@ -346,11 +346,11 @@ def _construct_lookups():
_construct_lookups()
-def dtype2char(dtype):
- dtype = obj2dtype(dtype)
- if dtype is None:
+def arrtype2char(arrtype):
+ arrtype = obj2arrtype(arrtype)
+ if arrtype is None:
raise ValueError, "unrecognized type"
- return _dtype2char_dict[dtype]
+ return _arrtype2char_dict[arrtype]
# Create dictionary of casting functions that wrap sequences
# indexed by type or type character
@@ -360,9 +360,9 @@ cast = _typedict()
ScalarType = [_types.IntType, _types.FloatType,
_types.ComplexType, _types.LongType, _types.BooleanType,
_types.StringType, _types.UnicodeType, _types.BufferType]
-ScalarType.extend(_dtype2char_dict.keys())
+ScalarType.extend(_arrtype2char_dict.keys())
ScalarType = tuple(ScalarType)
-for key in _dtype2char_dict.keys():
+for key in _arrtype2char_dict.keys():
cast[key] = lambda x, k=key : array(x, copy=False).astype(k)
@@ -370,9 +370,9 @@ _unicodesize = array('u','U').itemsize
# Create the typestring lookup dictionary
_typestr = _typedict()
-for key in _dtype2char_dict.keys():
+for key in _arrtype2char_dict.keys():
if issubclass(key, allTypes['flexible']):
- _typestr[key] = _dtype2char_dict[key]
+ _typestr[key] = _arrtype2char_dict[key]
else:
_typestr[key] = empty((1,),key).dtype.str[1:]
diff --git a/numpy/core/oldnumeric.py b/numpy/core/oldnumeric.py
index 863bd36bc..dad521d84 100644
--- a/numpy/core/oldnumeric.py
+++ b/numpy/core/oldnumeric.py
@@ -34,7 +34,7 @@ from numeric import asarray, array, correlate, outer, concatenate
from umath import sign, absolute, multiply
import numeric as _nx
import sys
-_dt_ = nt.dtype2char
+_dt_ = nt.arrtype2char
import types
diff --git a/numpy/core/src/arrayobject.c b/numpy/core/src/arrayobject.c
index 00fd2ff53..3f155ad73 100644
--- a/numpy/core/src/arrayobject.c
+++ b/numpy/core/src/arrayobject.c
@@ -3078,21 +3078,27 @@ array_richcompare(PyArrayObject *self, PyObject *other, int cmp_op)
n_ops.less_equal);
case Py_EQ:
/* Try to convert other to an array */
- array_other = PyArray_FromObject(other,
- self->descr->type_num, 0, 0);
- /* If not successful, then return the integer
- object 0. This fixes code that used to
- allow equality comparisons between arrays
- and other objects which would give a result
- of 0
- */
- if ((array_other == NULL) || \
- (array_other == Py_None)) {
- Py_XDECREF(array_other);
- PyErr_Clear();
- Py_INCREF(Py_False);
- return Py_False;
- }
+ if (!PyArray_Check(other)) {
+ array_other = PyArray_FromObject(other,
+ self->descr->type_num, 0, 0);
+ /* If not successful, then return the integer
+ object 0. This fixes code that used to
+ allow equality comparisons between arrays
+ and other objects which would give a result
+ of 0
+ */
+ if ((array_other == NULL) || \
+ (array_other == Py_None)) {
+ Py_XDECREF(array_other);
+ PyErr_Clear();
+ Py_INCREF(Py_False);
+ return Py_False;
+ }
+ }
+ else {
+ Py_INCREF(other);
+ array_other = other;
+ }
result = PyArray_GenericBinaryFunction(self,
array_other,
n_ops.equal);
@@ -3109,23 +3115,29 @@ array_richcompare(PyArrayObject *self, PyObject *other, int cmp_op)
return result;
case Py_NE:
/* Try to convert other to an array */
- array_other = PyArray_FromObject(other,
- self->descr->type_num, 0, 0);
- /* If not successful, then objects cannot be
- compared and cannot be equal, therefore,
- return True;
- */
- if ((array_other == NULL) || \
- (array_other == Py_None)) {
- Py_XDECREF(array_other);
- PyErr_Clear();
- Py_INCREF(Py_True);
- return Py_True;
- }
- result = PyArray_GenericBinaryFunction(self,
+ if (!PyArray_Check(other)) {
+ array_other = PyArray_FromObject(other,
+ self->descr->type_num, 0, 0);
+ /* If not successful, then objects cannot be
+ compared and cannot be equal, therefore,
+ return True;
+ */
+ if ((array_other == NULL) || \
+ (array_other == Py_None)) {
+ Py_XDECREF(array_other);
+ PyErr_Clear();
+ Py_INCREF(Py_True);
+ return Py_True;
+ }
+ }
+ else {
+ Py_INCREF(other);
+ array_other = other;
+ }
+ result = PyArray_GenericBinaryFunction(self,
array_other,
- n_ops.not_equal);
- Py_DECREF(array_other);
+ n_ops.not_equal);
+ Py_DECREF(array_other);
if (result == NULL) {
PyErr_Clear();
Py_INCREF(Py_True);
diff --git a/numpy/core/src/umathmodule.c.src b/numpy/core/src/umathmodule.c.src
index 2ad3a9385..1375efaa0 100644
--- a/numpy/core/src/umathmodule.c.src
+++ b/numpy/core/src/umathmodule.c.src
@@ -1578,10 +1578,37 @@ static void
/**begin repeat
-#TYPE=(BYTE,UBYTE,SHORT,USHORT,INT,UINT,LONG,ULONG,LONGLONG,ULONGLONG)*6#
-#typ=(byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong)*6#
-#OP= %*10, &*10, |*10, ^*10, <<*10, >>*10#
-#kind=fmod*10, bitwise_and*10, bitwise_or*10, bitwise_xor*10, left_shift*10, right_shift*10#
+#TYPE=BYTE,UBYTE,SHORT,USHORT,INT,UINT,LONG,ULONG,LONGLONG,ULONGLONG#
+#typ=byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong#
+*/
+static void
+@TYPE@_fmod(char **args, intp *dimensions, intp *steps, void *func)
+{
+ register intp i;
+ intp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];
+ char *i1=args[0], *i2=args[1], *op=args[2];
+ @typ@ x, y;
+ for(i=0; i<n; i++, i1+=is1, i2+=is2, op+=os) {
+ x = *((@typ@ *)i1);
+ y = *((@typ@ *)i2);
+ if (y == 0) {
+ generate_divbyzero_error();
+ *((@typ@ *)op) = 0;
+ }
+ else {
+ *((@typ@ *)op)= x % y;
+ }
+
+ }
+}
+/**end repeat**/
+
+/**begin repeat
+
+#TYPE=(BYTE,UBYTE,SHORT,USHORT,INT,UINT,LONG,ULONG,LONGLONG,ULONGLONG)*5#
+#typ=(byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong)*5#
+#OP= &*10, |*10, ^*10, <<*10, >>*10#
+#kind=bitwise_and*10, bitwise_or*10, bitwise_xor*10, left_shift*10, right_shift*10#
*/
static void
diff --git a/numpy/lib/getlimits.py b/numpy/lib/getlimits.py
index 3b5bd9211..e2d68147f 100644
--- a/numpy/lib/getlimits.py
+++ b/numpy/lib/getlimits.py
@@ -27,7 +27,7 @@ class finfo(object):
if obj is not None:
return obj
dtypes = [dtype]
- newdtype = numeric.obj2dtype(dtype)
+ newdtype = numeric.obj2arrtype(dtype)
if newdtype is not dtype:
dtypes.append(newdtype)
dtype = newdtype
diff --git a/numpy/lib/type_check.py b/numpy/lib/type_check.py
index 7a00d9be3..9157ee0a9 100644
--- a/numpy/lib/type_check.py
+++ b/numpy/lib/type_check.py
@@ -6,8 +6,8 @@ __all__ = ['iscomplexobj','isrealobj','imag','iscomplex',
'common_type']
import numpy.core.numeric as _nx
-from numpy.core.numeric import ndarray, asarray, array, isinf, isnan, isfinite, signbit, \
- ufunc, ScalarType, obj2dtype
+from numpy.core.numeric import ndarray, asarray, array, isinf, isnan, \
+ isfinite, signbit, ufunc, ScalarType, obj2arrtype
from ufunclike import isneginf, isposinf
import numpy.core.umath as umath
@@ -44,7 +44,7 @@ def mintypecode(typechars,typeset='GDFgdf',default='d'):
def asfarray(a, dtype=_nx.float_):
"""asfarray(a,dtype=None) returns a as a float array."""
- dtype = _nx.obj2dtype(dtype)
+ dtype = _nx.obj2arrtype(dtype)
if not issubclass(dtype, _nx.inexact):
dtype = _nx.float_
a = asarray(a,dtype=dtype)
@@ -83,7 +83,7 @@ def nan_to_num(x):
try:
t = x.dtype.type
except AttributeError:
- t = obj2dtype(type(x))
+ t = obj2arrtype(type(x))
if issubclass(t, _nx.complexfloating):
y = nan_to_num(x.real) + 1j * nan_to_num(x.imag)
elif issubclass(t, _nx.integer):
diff --git a/numpy/lib/utils.py b/numpy/lib/utils.py
index a776c83b6..e9ff9e540 100644
--- a/numpy/lib/utils.py
+++ b/numpy/lib/utils.py
@@ -1,6 +1,6 @@
-from numpy.core.numerictypes import obj2dtype
+from numpy.core.numerictypes import obj2arrtype
-__all__ = ['issubclass_', 'get_numpy_include', 'issubdtype']
+__all__ = ['issubclass_', 'get_numpy_include', 'issubarrtype']
def issubclass_(arg1, arg2):
try:
@@ -8,8 +8,8 @@ def issubclass_(arg1, arg2):
except TypeError:
return False
-def issubdtype(arg1, arg2):
- return issubclass(obj2dtype(arg1), obj2dtype(arg2))
+def issubarrtype(arg1, arg2):
+ return issubclass(obj2arrtype(arg1), obj2arrtype(arg2))
def get_numpy_include():
"""Return the directory in the package that contains the numpy/*.h header