Author: Romain Guillebert <romain...@gmail.com> Branch: numpy-subarrays Changeset: r64158:3d2788d2e2dd Date: 2013-05-15 15:46 +0200 http://bitbucket.org/pypy/pypy/changeset/3d2788d2e2dd/
Log: Implement reading subarrays 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 @@ -11,7 +11,6 @@ from rpython.rtyper.lltypesystem import rffi, lltype from rpython.rlib.rawstorage import free_raw_storage, raw_storage_getitem,\ raw_storage_setitem, RAW_STORAGE -from pypy.module.micronumpy.arrayimpl.sort import argsort_array from rpython.rlib.debug import make_sure_not_resized @@ -324,6 +323,7 @@ orig_array) def argsort(self, space, w_axis): + from pypy.module.micronumpy.arrayimpl.sort import argsort_array return argsort_array(self, space, w_axis) def base(self): diff --git a/pypy/module/micronumpy/arrayimpl/sort.py b/pypy/module/micronumpy/arrayimpl/sort.py --- a/pypy/module/micronumpy/arrayimpl/sort.py +++ b/pypy/module/micronumpy/arrayimpl/sort.py @@ -12,7 +12,7 @@ from rpython.rlib.objectmodel import specialize from pypy.interpreter.error import OperationError from pypy.module.micronumpy.base import W_NDimArray -from pypy.module.micronumpy import interp_dtype, types +from pypy.module.micronumpy import types from pypy.module.micronumpy.iter import AxisIterator INT_SIZE = rffi.sizeof(lltype.Signed) @@ -20,7 +20,7 @@ def make_sort_function(space, itemtype, comp_type, count=1): TP = itemtype.T step = rffi.sizeof(TP) - + class Repr(object): def __init__(self, index_stride_size, stride_size, size, values, indexes, index_start, start): @@ -69,12 +69,13 @@ class ArgArrayRepWithStorage(Repr): def __init__(self, index_stride_size, stride_size, size): + from pypy.module.micronumpy import interp_dtype start = 0 dtype = interp_dtype.get_dtype_cache(space).w_longdtype self.indexes = dtype.itemtype.malloc(size*dtype.get_size()) - self.values = alloc_raw_storage(size * stride_size, + self.values = alloc_raw_storage(size * stride_size, track_allocation=False) - Repr.__init__(self, index_stride_size, stride_size, + Repr.__init__(self, index_stride_size, stride_size, size, self.values, self.indexes, start, start) def __del__(self): @@ -96,7 +97,7 @@ for i in range(stop-start): retval.setitem(i, lst.getitem(i+start)) return retval - + if count < 2: def arg_lt(a, b): # Does numpy do <= ? @@ -108,13 +109,14 @@ return True elif a[0][i] > b[0][i]: return False - # Does numpy do True? + # Does numpy do True? return False ArgSort = make_timsort_class(arg_getitem, arg_setitem, arg_length, arg_getitem_slice, arg_lt) def argsort(arr, space, w_axis, itemsize): + from pypy.module.micronumpy import interp_dtype if w_axis is space.w_None: # note that it's fine ot pass None here as we're not going # to pass the result around (None is the link to base in slices) @@ -180,7 +182,7 @@ class SortCache(object): built = False - + def __init__(self, space): if self.built: return diff --git a/pypy/module/micronumpy/interp_dtype.py b/pypy/module/micronumpy/interp_dtype.py --- a/pypy/module/micronumpy/interp_dtype.py +++ b/pypy/module/micronumpy/interp_dtype.py @@ -355,9 +355,11 @@ size = 1 if space.isinstance_w(w_shape, space.w_int): w_shape = space.newtuple([w_shape]) - shape = space.listview(w_shape) - for dim in shape: - size *= space.int_w(dim) + shape = [] + for w_dim in space.fixedview(w_shape): + dim = space.int_w(w_dim) + shape.append(dim) + size *= dim return W_Dtype(types.VoidType(subdtype.itemtype.get_element_size() * size), 20, VOIDLTR, "void" + str(8 * subdtype.itemtype.get_element_size() * size), "V", space.gettypefor(interp_boxes.W_VoidBox), shape=shape, subdtype=subdtype) 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 @@ -2703,10 +2703,12 @@ from numpypy import dtype, array d = dtype([("x", "int", 3), ("y", "float", 5)]) - a = array([([1, 2, 3], [0.5, 1.5, 2.5, 3.5, 4.5])], dtype=d) + a = array([([1, 2, 3], [0.5, 1.5, 2.5, 3.5, 4.5]), ([4, 5, 6], [5.5, 6.5, 7.5, 8.5, 9.5])], dtype=d) assert (a[0]["x"] == [1, 2, 3]).all() - assert (a[1]["y"] == [0.5, 1.5, 2.5, 3.5, 4.5]).all() + assert (a[0]["y"] == [0.5, 1.5, 2.5, 3.5, 4.5]).all() + assert (a[1]["x"] == [4, 5, 6]).all() + assert (a[1]["y"] == [5.5, 6.5, 7.5, 8.5, 9.5]).all() class AppTestPyPy(BaseNumpyAppTest): diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py --- a/pypy/module/micronumpy/types.py +++ b/pypy/module/micronumpy/types.py @@ -3,7 +3,9 @@ from pypy.interpreter.error import OperationError from pypy.module.micronumpy import interp_boxes +from pypy.module.micronumpy import support from pypy.module.micronumpy.arrayimpl.voidbox import VoidBoxStorage +from pypy.module.micronumpy.arrayimpl.concrete import SliceArray from pypy.objspace.std.floatobject import float2string from pypy.objspace.std.complexobject import str_format from rpython.rlib import rfloat, clibffi, rcomplex @@ -1718,6 +1720,14 @@ for k in range(self.get_element_size()): arr.storage[k + ofs] = box.arr.storage[k + box.ofs] + def read(self, arr, i, offset, dtype=None): + from pypy.module.micronumpy.base import W_NDimArray + if dtype is None: + dtype = arr.dtype + strides, backstrides = support.calc_strides(dtype.shape, dtype.subdtype, arr.order) + implementation = SliceArray(i + offset, strides, backstrides, dtype.shape, arr, arr, dtype.subdtype) + return W_NDimArray(implementation) + NonNativeVoidType = VoidType NonNativeStringType = StringType _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit