Author: Matti Picus <[email protected]>
Branch:
Changeset: r65064:0abc7abacba2
Date: 2013-06-28 15:39 +0300
http://bitbucket.org/pypy/pypy/changeset/0abc7abacba2/
Log: merge ndarray-view which implements view() for ndarrays and zeroD
arrays, but not for scalars
diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -61,3 +61,7 @@
.. branch: faster-str-of-bigint
Improve performance of str(long).
+
+.. branch: ndarray-view
+Add view to ndarray and zeroD arrays, not on dtype scalars yet
+
diff --git a/pypy/module/micronumpy/arrayimpl/concrete.py
b/pypy/module/micronumpy/arrayimpl/concrete.py
--- a/pypy/module/micronumpy/arrayimpl/concrete.py
+++ b/pypy/module/micronumpy/arrayimpl/concrete.py
@@ -75,6 +75,12 @@
else:
return None
+ def get_view(self, orig_array, dtype, new_shape):
+ strides, backstrides = support.calc_strides(new_shape, dtype,
+ self.order)
+ return SliceArray(self.start, strides, backstrides, new_shape,
+ self, orig_array, dtype=dtype)
+
def get_real(self, orig_array):
strides = self.get_strides()
backstrides = self.get_backstrides()
diff --git a/pypy/module/micronumpy/arrayimpl/scalar.py
b/pypy/module/micronumpy/arrayimpl/scalar.py
--- a/pypy/module/micronumpy/arrayimpl/scalar.py
+++ b/pypy/module/micronumpy/arrayimpl/scalar.py
@@ -63,6 +63,11 @@
def transpose(self, _):
return self
+ def get_view(self, orig_array, dtype, new_shape):
+ scalar = Scalar(dtype)
+ scalar.value = self.value.convert_to(dtype)
+ return scalar
+
def get_real(self, orig_array):
if self.dtype.is_complex_type():
scalar = Scalar(self.dtype.float_type)
diff --git a/pypy/module/micronumpy/interp_boxes.py
b/pypy/module/micronumpy/interp_boxes.py
--- a/pypy/module/micronumpy/interp_boxes.py
+++ b/pypy/module/micronumpy/interp_boxes.py
@@ -240,6 +240,16 @@
v = self.convert_to(self.get_dtype(space))
return self.get_dtype(space).itemtype.round(v, decimals)
+ def descr_view(self, space, w_dtype):
+ from pypy.module.micronumpy.interp_dtype import W_Dtype
+ dtype = space.interp_w(W_Dtype,
+ space.call_function(space.gettypefor(W_Dtype), w_dtype))
+ if dtype.get_size() != self.get_dtype(space).get_size():
+ raise OperationError(space.w_ValueError, space.wrap(
+ "new type not compatible with array."))
+ raise OperationError(space.w_NotImplementedError, space.wrap(
+ "view not implelemnted yet"))
+
class W_BoolBox(W_GenericBox, PrimitiveBox):
descr__new__, _get_dtype, descr_reduce = new_dtype_getter("bool")
@@ -507,6 +517,7 @@
all = interp2app(W_GenericBox.descr_all),
ravel = interp2app(W_GenericBox.descr_ravel),
round = interp2app(W_GenericBox.descr_round),
+ view = interp2app(W_GenericBox.descr_view),
)
W_BoolBox.typedef = TypeDef("bool_", W_GenericBox.typedef,
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
@@ -618,8 +618,38 @@
"trace not implemented yet"))
def descr_view(self, space, w_dtype=None, w_type=None) :
- raise OperationError(space.w_NotImplementedError, space.wrap(
- "view not implemented yet"))
+ if w_type is not None:
+ raise OperationError(space.w_NotImplementedError, space.wrap(
+ "view(... type=<class>) not implemented yet"))
+ if w_dtype:
+ dtype = space.interp_w(interp_dtype.W_Dtype,
+ space.call_function(space.gettypefor(interp_dtype.W_Dtype),
+ w_dtype))
+ else:
+ dtype = self.get_dtype()
+ factor = float(dtype.get_size()) / self.get_dtype().get_size()
+ if self.get_size() % factor != 0:
+ raise OperationError(space.w_ValueError, space.wrap(
+ "new type not compatible with array."))
+ impl = self.implementation
+ new_shape = self.get_shape()
+ if len(new_shape) > 0:
+ if impl.get_strides()[0] < impl.get_strides()[-1]:
+ new_shape[0] = int(new_shape[0] / factor)
+ if new_shape[0] == 0:
+ raise OperationError(space.w_ValueError, space.wrap(
+ "new type not compatible with array shape"))
+ else:
+ new_shape[-1] = int(new_shape[-1] / factor)
+ if new_shape[-1] == 0:
+ raise OperationError(space.w_ValueError, space.wrap(
+ "new type not compatible with array shape"))
+ else:
+ if factor != 1:
+ raise OperationError(space.w_ValueError, space.wrap(
+ "new type not compatible with array shape"))
+ return W_NDimArray(impl.get_view(self, dtype, new_shape))
+
# --------------------- operations ----------------------------
@@ -996,6 +1026,7 @@
round = interp2app(W_NDimArray.descr_round),
data = GetSetProperty(W_NDimArray.descr_get_data),
diagonal = interp2app(W_NDimArray.descr_diagonal),
+ view = interp2app(W_NDimArray.descr_view),
ctypes = GetSetProperty(W_NDimArray.descr_get_ctypes), # XXX unimplemented
__array_interface__ = GetSetProperty(W_NDimArray.descr_array_iface),
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
@@ -1411,6 +1411,39 @@
assert a[3].imag == -10
assert a[2].imag == -5
+ def test_ndarray_view(self):
+ from numpypy import array, int8, int16, dtype
+ x = array([(1, 2)], dtype=[('a', int8), ('b', int8)])
+ y = x.view(dtype=int16)
+ print y,y.shape
+ assert y[0] == 513
+ assert y.dtype == dtype('int16')
+ y[0] = 670
+ assert x['a'] == -98
+ assert x['b'] == 2
+ f = array([1000, -1234], dtype='i4')
+ nnp = self.non_native_prefix
+ d = f.view(dtype=nnp + 'i4')
+ assert (d == [-402456576, 788267007]).all()
+ x = array(range(15), dtype='i2').reshape(3,5)
+ exc = raises(ValueError, x.view, dtype='i4')
+ assert exc.value[0] == "new type not compatible with array."
+ assert x.view('int8').shape == (3, 10)
+ x = array(range(15), dtype='int16').reshape(3,5).T
+ assert x.view('int8').shape == (10, 3)
+
+ def test_scalar_view(self):
+ from numpypy import int64, array
+ a = array(0, dtype='int32')
+ b = a.view(dtype='float32')
+ assert b.shape == ()
+ assert b == 0
+ s = int64(12)
+ exc = raises(ValueError, s.view, 'int8')
+ assert exc.value[0] == "new type not compatible with array."
+ skip('not implemented yet')
+ assert s.view('double') < 7e-323
+
def test_tolist_scalar(self):
from numpypy import int32, bool_
x = int32(23)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit