Author: Romain Guillebert <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit