[pypy-commit] pypy default: implement numpy.result_type function
bdkearns
noreply at buildbot.pypy.org
Thu Oct 9 18:41:34 CEST 2014
Author: Brian Kearns <bdkearns at gmail.com>
Branch:
Changeset: r73865:84e2e30e7551
Date: 2014-10-09 12:40 -0400
http://bitbucket.org/pypy/pypy/changeset/84e2e30e7551/
Log: implement numpy.result_type function
diff --git a/pypy/module/micronumpy/__init__.py b/pypy/module/micronumpy/__init__.py
--- a/pypy/module/micronumpy/__init__.py
+++ b/pypy/module/micronumpy/__init__.py
@@ -20,6 +20,7 @@
'concatenate': 'arrayops.concatenate',
'count_nonzero': 'arrayops.count_nonzero',
'dot': 'arrayops.dot',
+ 'result_type': 'arrayops.result_type',
'where': 'arrayops.where',
'set_string_function': 'appbridge.set_string_function',
diff --git a/pypy/module/micronumpy/arrayops.py b/pypy/module/micronumpy/arrayops.py
--- a/pypy/module/micronumpy/arrayops.py
+++ b/pypy/module/micronumpy/arrayops.py
@@ -1,3 +1,4 @@
+from rpython.rlib import jit
from pypy.interpreter.error import OperationError, oefmt
from pypy.interpreter.gateway import unwrap_spec
from pypy.module.micronumpy import loop, descriptor, ufuncs, support, \
@@ -6,6 +7,7 @@
from pypy.module.micronumpy.converters import clipmode_converter
from pypy.module.micronumpy.strides import Chunk, Chunks, shape_agreement, \
shape_agreement_multiple
+from .boxes import W_GenericBox
def where(space, w_arr, w_x=None, w_y=None):
@@ -283,3 +285,26 @@
else:
loop.diagonal_array(space, arr, out, offset, axis1, axis2, shape)
return out
+
+
+ at jit.unroll_safe
+def result_type(space, __args__):
+ args_w, kw_w = __args__.unpack()
+ if kw_w:
+ raise oefmt(space.w_TypeError, "result_type() takes no keyword arguments")
+ result = None
+ for w_arg in args_w:
+ if isinstance(w_arg, W_NDimArray):
+ dtype = w_arg.get_dtype()
+ elif isinstance(w_arg, W_GenericBox) or (
+ space.isinstance_w(w_arg, space.w_int) or
+ space.isinstance_w(w_arg, space.w_float) or
+ space.isinstance_w(w_arg, space.w_complex) or
+ space.isinstance_w(w_arg, space.w_long) or
+ space.isinstance_w(w_arg, space.w_bool)):
+ dtype = ufuncs.find_dtype_for_scalar(space, w_arg)
+ else:
+ dtype = space.interp_w(descriptor.W_Dtype,
+ space.call_function(space.gettypefor(descriptor.W_Dtype), w_arg))
+ result = ufuncs.find_binop_result_dtype(space, result, dtype)
+ return result
diff --git a/pypy/module/micronumpy/test/test_arrayops.py b/pypy/module/micronumpy/test/test_arrayops.py
--- a/pypy/module/micronumpy/test/test_arrayops.py
+++ b/pypy/module/micronumpy/test/test_arrayops.py
@@ -199,3 +199,17 @@
a.put(23, -1, mode=1) # wrap
assert (a == array([0, 1, -10, -1, -15])).all()
raises(TypeError, "arange(5).put(22, -5, mode='zzzz')") # unrecognized mode
+
+ def test_result_type(self):
+ import numpy as np
+ exc = raises(TypeError, np.result_type, a=2)
+ assert str(exc.value) == "result_type() takes no keyword arguments"
+ assert np.result_type(True) is np.dtype('bool')
+ assert np.result_type(1) is np.dtype('int64')
+ assert np.result_type(1.) is np.dtype('float64')
+ assert np.result_type(1+2j) is np.dtype('complex128')
+ assert np.result_type(1, 1.) is np.dtype('float64')
+ assert np.result_type(np.array([1, 2])) is np.dtype('int64')
+ assert np.result_type(np.array([1, 2]), 1, 1+2j) is np.dtype('complex128')
+ assert np.result_type(np.array([1, 2]), 1, 'float64') is np.dtype('float64')
+ assert np.result_type(np.array([1, 2]), 1, None) is np.dtype('float64')
More information about the pypy-commit
mailing list