[pypy-commit] pypy default: provide ndarray.{take, ptp}
bdkearns
noreply at buildbot.pypy.org
Tue Oct 29 02:17:00 CET 2013
Author: Brian Kearns <bdkearns at gmail.com>
Branch:
Changeset: r67671:95d235f14315
Date: 2013-10-28 20:53 -0400
http://bitbucket.org/pypy/pypy/changeset/95d235f14315/
Log: provide ndarray.{take, ptp}
diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -1,6 +1,7 @@
from pypy.interpreter.error import operationerrfmt, OperationError
from pypy.interpreter.typedef import TypeDef, GetSetProperty, make_weakref_descr
-from pypy.interpreter.gateway import interp2app, unwrap_spec
+from pypy.interpreter.gateway import interp2app, unwrap_spec, applevel, \
+ WrappedDefault
from pypy.module.micronumpy.base import W_NDimArray, convert_to_array,\
ArrayArgumentException, issequence_w, wrap_impl
from pypy.module.micronumpy import interp_dtype, interp_ufuncs, interp_boxes,\
@@ -359,18 +360,11 @@
"order not implemented"))
return self.descr_reshape(space, [space.wrap(-1)])
- def descr_take(self, space, w_obj, w_axis=None, w_out=None):
- # if w_axis is None and w_out is Nont this is an equivalent to
- # fancy indexing
- raise OperationError(space.w_NotImplementedError,
- space.wrap("unsupported for now"))
- if not space.is_none(w_axis):
- raise OperationError(space.w_NotImplementedError,
- space.wrap("axis unsupported for take"))
- if not space.is_none(w_out):
- raise OperationError(space.w_NotImplementedError,
- space.wrap("out unsupported for take"))
- return self.getitem_int(space, convert_to_array(space, w_obj))
+ @unwrap_spec(w_axis=WrappedDefault(None),
+ w_out=WrappedDefault(None),
+ w_mode=WrappedDefault('raise'))
+ def descr_take(self, space, w_obj, w_axis, w_out, w_mode):
+ return app_take(space, self, w_obj, w_axis, w_out, w_mode)
def descr_compress(self, space, w_obj, w_axis=None):
if not space.is_none(w_axis):
@@ -581,9 +575,10 @@
raise OperationError(space.w_NotImplementedError, space.wrap(
"newbyteorder not implemented yet"))
- def descr_ptp(self, space, w_axis=None, w_out=None):
- raise OperationError(space.w_NotImplementedError, space.wrap(
- "ptp (peak to peak) not implemented yet"))
+ @unwrap_spec(w_axis=WrappedDefault(None),
+ w_out=WrappedDefault(None))
+ def descr_ptp(self, space, w_axis, w_out):
+ return app_ptp(space, self, w_axis, w_out)
def descr_put(self, space, w_indices, w_values, w_mode=None):
put(space, self, w_indices, w_values, w_mode)
@@ -1005,6 +1000,32 @@
else:
return W_NDimArray.from_shape_and_storage(space, shape, storage, dtype)
+app_take = applevel(r"""
+ def take(a, indices, axis, out, mode):
+ assert mode == 'raise'
+ if axis is None:
+ res = a.ravel()[indices]
+ else:
+ if axis < 0: axis += len(a.shape)
+ s0, s1 = a.shape[:axis], a.shape[axis+1:]
+ l0 = prod(s0) if s0 else 1
+ l1 = prod(s1) if s1 else 1
+ res = a.reshape((l0, -1, l1))[:,indices,:].reshape(s0 + (-1,) + s1)
+ if out is not None:
+ out[:] = res
+ return out
+ return res
+""", filename=__file__).interphook('take')
+
+app_ptp = applevel(r"""
+ def ptp(a, axis, out):
+ res = a.max(axis) - a.min(axis)
+ if out is not None:
+ out[:] = res
+ return out
+ return res
+""", filename=__file__).interphook('ptp')
+
W_NDimArray.typedef = TypeDef(
"ndarray",
__module__ = "numpypy",
@@ -1114,6 +1135,7 @@
flatten = interp2app(W_NDimArray.descr_flatten),
ravel = interp2app(W_NDimArray.descr_ravel),
take = interp2app(W_NDimArray.descr_take),
+ ptp = interp2app(W_NDimArray.descr_ptp),
compress = interp2app(W_NDimArray.descr_compress),
repeat = interp2app(W_NDimArray.descr_repeat),
swapaxes = interp2app(W_NDimArray.descr_swapaxes),
diff --git a/pypy/module/micronumpy/test/test_numarray.py b/pypy/module/micronumpy/test/test_numarray.py
--- a/pypy/module/micronumpy/test/test_numarray.py
+++ b/pypy/module/micronumpy/test/test_numarray.py
@@ -2450,10 +2450,6 @@
def test_take(self):
from numpypy import arange
- try:
- arange(10).take([0])
- except NotImplementedError:
- skip("we wait for int-based indexing")
assert (arange(10).take([1, 2, 1, 1]) == [1, 2, 1, 1]).all()
raises(IndexError, "arange(3).take([15])")
a = arange(6).reshape(2, 3)
@@ -2462,6 +2458,13 @@
a = arange(12).reshape(2, 6)
assert (a[:,::2].take([3, 2, 1]) == [6, 4, 2]).all()
+ def test_ptp(self):
+ import numpypy as np
+ x = np.arange(4).reshape((2,2))
+ assert x.ptp() == 3
+ assert (x.ptp(axis=0) == [2, 2]).all()
+ assert (x.ptp(axis=1) == [1, 1]).all()
+
def test_compress(self):
from numpypy import arange, array
a = arange(10)
More information about the pypy-commit
mailing list