[pypy-commit] pypy default: test, implement more of np.array(), allow changing dtype, correctly create views when copy=False
mattip
noreply at buildbot.pypy.org
Thu Jun 27 20:40:21 CEST 2013
Author: Matti Picus <matti.picus at gmail.com>
Branch:
Changeset: r65042:8597c6c08cd3
Date: 2013-06-27 21:39 +0300
http://bitbucket.org/pypy/pypy/changeset/8597c6c08cd3/
Log: test, implement more of np.array(), allow changing dtype, correctly
create views when copy=False
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
@@ -1028,15 +1028,19 @@
order)
dtype = interp_dtype.decode_w_dtype(space, w_dtype)
- if isinstance(w_object, W_NDimArray):
- if (not space.is_none(w_dtype) and
- w_object.get_dtype() is not dtype):
- raise OperationError(space.w_NotImplementedError, space.wrap(
- "copying over different dtypes unsupported"))
+ if isinstance(w_object, W_NDimArray) and \
+ (space.is_none(w_dtype) or w_object.get_dtype() is dtype):
+ shape = w_object.get_shape()
if copy:
- return w_object.descr_copy(space)
- return w_object
-
+ w_ret = w_object.descr_copy(space)
+ else:
+ new_impl = w_object.implementation.set_shape(space, w_object, shape)
+ w_ret = W_NDimArray(new_impl)
+ if ndmin > len(shape):
+ shape = [1] * (ndmin - len(shape)) + shape
+ w_ret.implementation = w_ret.implementation.set_shape(space,
+ w_ret, shape)
+ return w_ret
shape, elems_w = find_shape_and_elems(space, w_object, dtype)
if dtype is None or (
dtype.is_str_or_unicode() and dtype.itemtype.get_size() < 1):
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
@@ -276,6 +276,24 @@
arr = array([1], ndmin=3)
assert arr.shape == (1, 1, 1)
+ def test_array_copy(self):
+ from numpypy import array
+ a = array(range(12)).reshape(3,4)
+ b = array(a, ndmin=4)
+ assert b.shape == (1, 1, 3, 4)
+ b = array(a, copy=False)
+ b[0, 0] = 100
+ assert a[0, 0] == 100
+ b = array(a, copy=True, ndmin=2)
+ b[0, 0] = 0
+ assert a[0, 0] == 100
+ b = array(a, dtype=float)
+ assert (b[0] == [100, 1, 2, 3]).all()
+ assert b.dtype.kind == 'f'
+ b = array(a, copy=False, ndmin=4)
+ b[0,0,0,0] = 0
+ assert a[0, 0] == 0
+
def test_type(self):
from numpypy import array
ar = array(range(5))
More information about the pypy-commit
mailing list