Author: Matti Picus <[email protected]>
Branch: numpy-subarrays
Changeset: r64258:12e7922e4209
Date: 2013-05-17 16:15 +0300
http://bitbucket.org/pypy/pypy/changeset/12e7922e4209/
Log: fix VoidType. When not part of a RecordType it simply expands a new
ndarray by its shape, using base type
diff --git a/pypy/module/micronumpy/base.py b/pypy/module/micronumpy/base.py
--- a/pypy/module/micronumpy/base.py
+++ b/pypy/module/micronumpy/base.py
@@ -27,10 +27,10 @@
from pypy.module.micronumpy.arrayimpl import concrete, scalar
if not shape:
- impl = scalar.Scalar(dtype)
+ impl = scalar.Scalar(dtype.base)
else:
- strides, backstrides = calc_strides(shape, dtype, order)
- impl = concrete.ConcreteArray(shape, dtype, order, strides,
+ strides, backstrides = calc_strides(shape, dtype.base, order)
+ impl = concrete.ConcreteArray(shape, dtype.base, order, strides,
backstrides)
return W_NDimArray(impl)
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
@@ -269,6 +269,7 @@
class W_VoidBox(W_FlexibleBox):
def descr_getitem(self, space, w_item):
+ from pypy.module.micronumpy.types import VoidType
if space.isinstance_w(w_item, space.w_str):
item = space.str_w(w_item)
elif space.isinstance_w(w_item, space.w_int):
@@ -287,7 +288,10 @@
except KeyError:
raise OperationError(space.w_IndexError,
space.wrap("Field %s does not exist" % item))
- read_val = dtype.itemtype.read(self.arr, self.ofs, ofs, dtype)
+ if isinstance(dtype.itemtype, VoidType):
+ read_val = dtype.itemtype.readarray(self.arr, self.ofs, ofs, dtype)
+ else:
+ read_val = dtype.itemtype.read(self.arr, self.ofs, ofs, dtype)
if isinstance (read_val, W_StringBox):
# StringType returns a str
return space.wrap(dtype.itemtype.to_str(read_val))
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
@@ -85,7 +85,6 @@
def getitem(self, arr, i):
item = self.itemtype.read(arr, i, 0)
- assert isinstance(item, interp_boxes.W_GenericBox)
return item
def getitem_bool(self, arr, i):
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
@@ -21,7 +21,7 @@
from rpython.rlib.rstring import StringBuilder
from pypy.module.micronumpy.arrayimpl.base import BaseArrayImplementation
-def _find_shape(space, w_size):
+def _find_shape(space, w_size, dtype):
if space.is_none(w_size):
return []
if space.isinstance_w(w_size, space.w_int):
@@ -29,6 +29,7 @@
shape = []
for w_item in space.fixedview(w_size):
shape.append(space.int_w(w_item))
+ shape += dtype.shape
return shape[:]
class __extend__(W_NDimArray):
@@ -829,7 +830,7 @@
space.wrap("unsupported param"))
dtype = space.interp_w(interp_dtype.W_Dtype,
space.call_function(space.gettypefor(interp_dtype.W_Dtype), w_dtype))
- shape = _find_shape(space, w_shape)
+ shape = _find_shape(space, w_shape, dtype)
if not shape:
return W_NDimArray.new_scalar(space, dtype)
return W_NDimArray.from_shape(shape, dtype)
@@ -842,10 +843,10 @@
"""
from rpython.rtyper.lltypesystem import rffi
from rpython.rlib.rawstorage import RAW_STORAGE_PTR
- shape = _find_shape(space, w_shape)
storage = rffi.cast(RAW_STORAGE_PTR, addr)
dtype = space.interp_w(interp_dtype.W_Dtype,
space.call_function(space.gettypefor(interp_dtype.W_Dtype), w_dtype))
+ shape = _find_shape(space, w_shape, dtype)
return W_NDimArray.from_shape_and_storage(shape, storage, dtype)
W_NDimArray.typedef = TypeDef(
@@ -1029,7 +1030,7 @@
dtype = space.interp_w(interp_dtype.W_Dtype,
space.call_function(space.gettypefor(interp_dtype.W_Dtype), w_dtype)
)
- shape = _find_shape(space, w_shape)
+ shape = _find_shape(space, w_shape, dtype)
if not shape:
return W_NDimArray.new_scalar(space, dtype, space.wrap(0))
return space.wrap(W_NDimArray.from_shape(shape, dtype=dtype, order=order))
@@ -1039,7 +1040,7 @@
dtype = space.interp_w(interp_dtype.W_Dtype,
space.call_function(space.gettypefor(interp_dtype.W_Dtype), w_dtype)
)
- shape = _find_shape(space, w_shape)
+ shape = _find_shape(space, w_shape, dtype)
if not shape:
return W_NDimArray.new_scalar(space, dtype, space.wrap(0))
arr = W_NDimArray.from_shape(shape, dtype=dtype, order=order)
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
@@ -18,10 +18,12 @@
def get_element_size():
return 1
+ def __init__(self):
+ self.base = self
+
def get_size(self):
return 1
-
def create_slice(a, chunks):
return Chunks(chunks).apply(W_NDimArray(a)).implementation
@@ -2700,7 +2702,7 @@
assert a[1]['y'] == 1
def test_subarrays(self):
- from numpypy import dtype, array
+ from numpypy import dtype, array, zeros
d = dtype([("x", "int", 3), ("y", "float", 5)])
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)
@@ -2715,6 +2717,13 @@
assert len(list(a[0])) == 2
+ d = dtype((float, (10, 10)))
+ a = zeros((3,3), dtype=d)
+ assert a[0, 0].shape == (10, 10)
+ assert a.shape == (3, 3, 10, 10)
+ a[0, 0] = 500
+ assert (a[0, 0, 0] == 500).all()
+ assert a[0, 0, 0].shape == (10,)
class AppTestPyPy(BaseNumpyAppTest):
def setup_class(cls):
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
@@ -1721,7 +1721,7 @@
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):
+ def readarray(self, arr, i, offset, dtype=None):
from pypy.module.micronumpy.base import W_NDimArray
if dtype is None:
dtype = arr.dtype
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit