Author: mattip <matti.pi...@gmail.com> Branch: fortran-order Changeset: r79911:a14943e46cef Date: 2015-09-30 23:17 +0300 http://bitbucket.org/pypy/pypy/changeset/a14943e46cef/
Log: implement order, pass many tests 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 @@ -108,7 +108,8 @@ w_axis = space.wrap(0) if space.is_none(w_axis): args_w = [w_arg.reshape(space, - space.newlist([w_arg.descr_get_size(space)])) + space.newlist([w_arg.descr_get_size(space)]), + w_arg.get_order()) for w_arg in args_w] w_axis = space.wrap(0) dtype = args_w[0].get_dtype() diff --git a/pypy/module/micronumpy/concrete.py b/pypy/module/micronumpy/concrete.py --- a/pypy/module/micronumpy/concrete.py +++ b/pypy/module/micronumpy/concrete.py @@ -92,17 +92,18 @@ def get_storage_size(self): return self.size - def reshape(self, orig_array, new_shape): + def reshape(self, orig_array, new_shape, order=NPY.ANYORDER): # Since we got to here, prod(new_shape) == self.size + order = support.get_order_as_CF(self.order, order) new_strides = None if self.size == 0: - new_strides, _ = calc_strides(new_shape, self.dtype, self.order) + new_strides, _ = calc_strides(new_shape, self.dtype, order) else: if len(self.get_shape()) == 0: new_strides = [self.dtype.elsize] * len(new_shape) else: new_strides = calc_new_strides(new_shape, self.get_shape(), - self.get_strides(), self.order) + self.get_strides(), order) if new_strides is None or len(new_strides) != len(new_shape): return None if new_strides is not None: @@ -306,10 +307,11 @@ return SliceArray(self.start, strides, backstrides, shape, self, orig_array) - def copy(self, space): + def copy(self, space, order=NPY.ANYORDER): + order = support.get_order_as_CF(self.order, order) strides, backstrides = calc_strides(self.get_shape(), self.dtype, - self.order) - impl = ConcreteArray(self.get_shape(), self.dtype, self.order, strides, + order) + impl = ConcreteArray(self.get_shape(), self.dtype, order, strides, backstrides) return loop.setslice(space, self.get_shape(), impl, self) diff --git a/pypy/module/micronumpy/ctors.py b/pypy/module/micronumpy/ctors.py --- a/pypy/module/micronumpy/ctors.py +++ b/pypy/module/micronumpy/ctors.py @@ -201,6 +201,7 @@ def _zeros_or_empty(space, w_shape, w_dtype, w_order, zero): + order = order_converter(space, w_order, NPY.CORDER) dtype = space.interp_w(descriptor.W_Dtype, space.call_function(space.gettypefor(descriptor.W_Dtype), w_dtype)) if dtype.is_str_or_unicode() and dtype.elsize < 1: @@ -214,7 +215,7 @@ support.product_check(shape) except OverflowError: raise oefmt(space.w_ValueError, "array is too big.") - return W_NDimArray.from_shape(space, shape, dtype=dtype, zero=zero) + return W_NDimArray.from_shape(space, shape, dtype, order, zero=zero) def empty(space, w_shape, w_dtype=None, w_order=None): return _zeros_or_empty(space, w_shape, w_dtype, w_order, zero=False) diff --git a/pypy/module/micronumpy/loop.py b/pypy/module/micronumpy/loop.py --- a/pypy/module/micronumpy/loop.py +++ b/pypy/module/micronumpy/loop.py @@ -680,8 +680,7 @@ def tostring(space, arr): builder = StringBuilder() iter, state = arr.create_iter() - w_res_str = W_NDimArray.from_shape(space, [1], arr.get_dtype(), - order=NPY.CORDER) + w_res_str = W_NDimArray.from_shape(space, [1], arr.get_dtype()) itemsize = arr.get_dtype().elsize with w_res_str.implementation as storage: res_str_casted = rffi.cast(rffi.CArrayPtr(lltype.Char), diff --git a/pypy/module/micronumpy/ndarray.py b/pypy/module/micronumpy/ndarray.py --- a/pypy/module/micronumpy/ndarray.py +++ b/pypy/module/micronumpy/ndarray.py @@ -99,12 +99,13 @@ def descr_tostring(self, space, w_order=None): try: order = order_converter(space, w_order, NPY.CORDER) - except OperationError as e: - raise oefmt(space.w_TypeError, "order not understood") - if order == NPY.FORTRANORDER: - raise OperationError(space.w_NotImplementedError, space.wrap( - "unsupported value for order")) - return space.wrap(loop.tostring(space, self)) + except: + raise oefmt(space.w_TypeError, "order not understood") + order = support.get_order_as_CF(self.get_order(), order) + arr = self + if order != arr.get_order(): + arr = W_NDimArray(self.implementation.transpose(self, None)) + return space.wrap(loop.tostring(space, arr)) def getitem_filter(self, space, arr): if arr.ndims() > 1 and arr.get_shape() != self.get_shape(): @@ -374,10 +375,7 @@ order = space.int_w(w_order) else: order = order_converter(space, w_order, NPY.KEEPORDER) - if order == NPY.FORTRANORDER: - raise OperationError(space.w_NotImplementedError, space.wrap( - "unsupported value for order")) - copy = self.implementation.copy(space) + copy = self.implementation.copy(space, order) w_subtype = space.type(self) return wrap_impl(space, w_subtype, self, copy) @@ -400,15 +398,15 @@ 'array does not have imaginary part to set') self.implementation.set_imag(space, self, w_value) - def reshape(self, space, w_shape): + def reshape(self, space, w_shape, order): new_shape = get_shape_from_iterable(space, self.get_size(), w_shape) - new_impl = self.implementation.reshape(self, new_shape) + new_impl = self.implementation.reshape(self, new_shape, order) if new_impl is not None: return wrap_impl(space, space.type(self), self, new_impl) # Create copy with contiguous data - arr = self.descr_copy(space) + arr = self.descr_copy(space, space.wrap(order)) if arr.get_size() > 0: - new_implementation = arr.implementation.reshape(self, new_shape) + new_implementation = arr.implementation.reshape(self, new_shape, order) if new_implementation is None: raise oefmt(space.w_ValueError, 'could not reshape array of size %d to shape %s', @@ -442,16 +440,13 @@ if order == NPY.KEEPORDER: raise OperationError(space.w_ValueError, space.wrap( "order 'K' is not permitted for reshaping")) - if order != NPY.CORDER and order != NPY.ANYORDER: - raise OperationError(space.w_NotImplementedError, space.wrap( - "unsupported value for order")) if len(args_w) == 1: if space.is_none(args_w[0]): return self.descr_view(space) w_shape = args_w[0] else: w_shape = space.newtuple(args_w) - return self.reshape(space, w_shape) + return self.reshape(space, w_shape, order) def descr_get_transpose(self, space, axes=None): return W_NDimArray(self.implementation.transpose(self, axes)) @@ -522,20 +517,8 @@ return space.newlist(l_w) def descr_ravel(self, space, w_order=None): - if space.is_none(w_order): - order = 'C' - else: - order = space.str_w(w_order) - if order == 'K' and is_c_contiguous(self.implementation): - for s in self.implementation.get_strides(): - if s < 0: - break - else: - order = 'C' - if order != 'C': - raise OperationError(space.w_NotImplementedError, space.wrap( - "order != 'C' only partially implemented")) - return self.reshape(space, space.wrap(-1)) + order = order_converter(space, w_order, self.get_order()) + return self.reshape(space, space.wrap(-1), order) @unwrap_spec(w_axis=WrappedDefault(None), w_out=WrappedDefault(None), @@ -549,14 +532,15 @@ space.wrap("axis unsupported for compress")) arr = self else: - arr = self.reshape(space, space.wrap(-1)) + arr = self.reshape(space, space.wrap(-1), self.get_order()) index = convert_to_array(space, w_obj) return arr.getitem_filter(space, index) def descr_flatten(self, space, w_order=None): + order = order_converter(space, w_order, self.get_order()) if self.is_scalar(): # scalars have no storage - return self.reshape(space, space.wrap(1)) + return self.reshape(space, space.wrap(1), order) w_res = self.descr_ravel(space, w_order) if w_res.implementation.storage == self.implementation.storage: return w_res.descr_copy(space) @@ -1202,7 +1186,7 @@ out = out_converter(space, w_out) if space.is_none(w_axis): w_axis = space.wrap(0) - arr = self.reshape(space, space.wrap(-1)) + arr = self.reshape(space, space.wrap(-1), self.get_order()) else: arr = self ufunc = getattr(ufuncs.get(space), ufunc_name) diff --git a/pypy/module/micronumpy/nditer.py b/pypy/module/micronumpy/nditer.py --- a/pypy/module/micronumpy/nditer.py +++ b/pypy/module/micronumpy/nditer.py @@ -144,14 +144,13 @@ 'Iterator flag EXTERNAL_LOOP cannot be used if an index or ' 'multi-index is being tracked') - -def is_backward(imp, order): - if order == NPY.KEEPORDER or (order == NPY.CORDER and imp.order == NPY.CORDER): +def is_backward(imp_order, order): + if imp_order == order: return False - elif order == NPY.FORTRANORDER and imp.order == NPY.CORDER: + if order == NPY.KEEPORDER: + return False + else: return True - else: - raise NotImplementedError('not implemented yet') class OperandIter(ArrayIter): @@ -514,7 +513,7 @@ dtype = self.dtypes[i] shape = self.shape imp = arr.implementation - backward = is_backward(imp, self.order) + backward = is_backward(imp.order, self.order) if arr.is_scalar(): return ConcreteIter(imp, 1, [], [], [], self.op_flags[i], self) if (abs(imp.strides[0]) < abs(imp.strides[-1]) and not backward) or \ diff --git a/pypy/module/micronumpy/test/test_ndarray.py b/pypy/module/micronumpy/test/test_ndarray.py --- a/pypy/module/micronumpy/test/test_ndarray.py +++ b/pypy/module/micronumpy/test/test_ndarray.py @@ -921,6 +921,9 @@ raises(ValueError, a.reshape, (0,), order="K") b = a.reshape((0,), order='F') assert b.shape == (0,) + a = array(range(24), 'uint8') + assert a.reshape([2, 3, 4], order=True).strides ==(1, 2, 6) + assert a.reshape([2, 3, 4], order=False).strides ==(12, 4, 1) def test_slice_reshape(self): from numpy import zeros, arange _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit