Author: Alex Gaynor <[email protected]>
Branch:
Changeset: r50076:ccf1f7b9b78b
Date: 2011-12-02 13:41 -0500
http://bitbucket.org/pypy/pypy/changeset/ccf1f7b9b78b/
Log: make numpy.ndarray refer to the class, and numpy.array be a funciton
which constructs it
diff --git a/pypy/module/micronumpy/__init__.py
b/pypy/module/micronumpy/__init__.py
--- a/pypy/module/micronumpy/__init__.py
+++ b/pypy/module/micronumpy/__init__.py
@@ -5,10 +5,11 @@
applevel_name = 'numpypy'
interpleveldefs = {
- 'array': 'interp_numarray.NDimArray',
+ 'ndarray': 'interp_numarray.W_NDimArray',
'dtype': 'interp_dtype.W_Dtype',
'ufunc': 'interp_ufuncs.W_Ufunc',
+ 'array': 'interp_numarray.array',
'zeros': 'interp_numarray.zeros',
'empty': 'interp_numarray.zeros',
'ones': 'interp_numarray.ones',
diff --git a/pypy/module/micronumpy/compile.py
b/pypy/module/micronumpy/compile.py
--- a/pypy/module/micronumpy/compile.py
+++ b/pypy/module/micronumpy/compile.py
@@ -9,7 +9,7 @@
from pypy.module.micronumpy import interp_boxes
from pypy.module.micronumpy.interp_dtype import get_dtype_cache
from pypy.module.micronumpy.interp_numarray import (Scalar, BaseArray,
- descr_new_array, scalar_w, NDimArray)
+ scalar_w, W_NDimArray, array)
from pypy.module.micronumpy import interp_ufuncs
from pypy.rlib.objectmodel import specialize, instantiate
@@ -53,7 +53,7 @@
self.fromcache = InternalSpaceCache(self).getorbuild
def issequence_w(self, w_obj):
- return isinstance(w_obj, ListObject) or isinstance(w_obj, NDimArray)
+ return isinstance(w_obj, ListObject) or isinstance(w_obj, W_NDimArray)
def isinstance_w(self, w_obj, w_tp):
return w_obj.tp == w_tp
@@ -303,8 +303,7 @@
[interp.space.wrap(float(i)) for i in range(self.v)]
)
dtype = get_dtype_cache(interp.space).w_float64dtype
- return descr_new_array(interp.space, None, w_list, w_dtype=dtype,
- w_order=None)
+ return array(interp.space, w_list, w_dtype=dtype, w_order=None)
def __repr__(self):
return 'Range(%s)' % self.v
@@ -326,8 +325,7 @@
def execute(self, interp):
w_list = self.wrap(interp.space)
dtype = get_dtype_cache(interp.space).w_float64dtype
- return descr_new_array(interp.space, None, w_list, w_dtype=dtype,
- w_order=None)
+ return array(interp.space, w_list, w_dtype=dtype, w_order=None)
def __repr__(self):
return "[" + ", ".join([repr(item) for item in self.items]) + "]"
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
@@ -98,47 +98,6 @@
endshape[i] = remainder[i]
return endshape
-def descr_new_array(space, w_subtype, w_item_or_iterable, w_dtype=None,
- w_order=NoneNotWrapped):
- # find scalar
- if not space.issequence_w(w_item_or_iterable):
- if space.is_w(w_dtype, space.w_None):
- w_dtype = interp_ufuncs.find_dtype_for_scalar(space,
- w_item_or_iterable)
- dtype = space.interp_w(interp_dtype.W_Dtype,
- space.call_function(space.gettypefor(interp_dtype.W_Dtype),
w_dtype)
- )
- return scalar_w(space, dtype, w_item_or_iterable)
- if w_order is None:
- order = 'C'
- else:
- order = space.str_w(w_order)
- if order != 'C': # or order != 'F':
- raise operationerrfmt(space.w_ValueError, "Unknown order: %s",
- order)
- shape, elems_w = _find_shape_and_elems(space, w_item_or_iterable)
- # they come back in C order
- size = len(elems_w)
- if space.is_w(w_dtype, space.w_None):
- w_dtype = None
- for w_elem in elems_w:
- w_dtype = interp_ufuncs.find_dtype_for_scalar(space, w_elem,
- w_dtype)
- if w_dtype is interp_dtype.get_dtype_cache(space).w_float64dtype:
- break
- if w_dtype is None:
- w_dtype = space.w_None
- dtype = space.interp_w(interp_dtype.W_Dtype,
- space.call_function(space.gettypefor(interp_dtype.W_Dtype), w_dtype)
- )
- arr = NDimArray(size, shape[:], dtype=dtype, order=order)
- shapelen = len(shape)
- arr_iter = arr.start_iter(arr.shape)
- for i in range(len(elems_w)):
- w_elem = elems_w[i]
- dtype.setitem(arr.storage, arr_iter.offset, dtype.coerce(space,
w_elem))
- arr_iter = arr_iter.next(shapelen)
- return arr
# Iterators for arrays
# --------------------
@@ -378,6 +337,13 @@
def add_invalidates(self, other):
self.invalidates.append(other)
+ def descr__new__(space, w_subtype, w_size, w_dtype=None):
+ dtype = space.interp_w(interp_dtype.W_Dtype,
+ space.call_function(space.gettypefor(interp_dtype.W_Dtype),
w_dtype)
+ )
+ size, shape = _find_size_and_shape(space, w_size)
+ return space.wrap(W_NDimArray(size, shape[:], dtype=dtype))
+
def _unaryop_impl(ufunc_name):
def impl(self, space):
return getattr(interp_ufuncs.get(space), ufunc_name).call(space,
[self])
@@ -814,9 +780,7 @@
return w_obj
elif space.issequence_w(w_obj):
# Convert to array.
- w_obj = space.call_function(space.gettypefor(BaseArray), w_obj)
- assert isinstance(w_obj, BaseArray)
- return w_obj
+ return array(space, w_obj, w_order=None)
else:
# If it's a scalar
dtype = interp_ufuncs.find_dtype_for_scalar(space, w_obj)
@@ -883,7 +847,7 @@
i = 0
signature = self.signature
result_size = self.find_size()
- result = NDimArray(result_size, self.shape, self.find_dtype())
+ result = W_NDimArray(result_size, self.shape, self.find_dtype())
shapelen = len(self.shape)
i = self.start_iter()
ri = result.start_iter()
@@ -1110,14 +1074,14 @@
return 'Slice(%s)' % self.parent.debug_repr()
def copy(self):
- array = NDimArray(self.size, self.shape[:], self.find_dtype())
+ array = W_NDimArray(self.size, self.shape[:], self.find_dtype())
iter = self.start_iter()
while not iter.done():
array.setitem(iter.offset, self.getitem(iter.offset))
iter = iter.next(len(self.shape))
return array
-class NDimArray(BaseArray):
+class W_NDimArray(BaseArray):
""" A class representing contiguous array. We know that each iteration
by say ufunc will increase the data index by one
"""
@@ -1144,7 +1108,7 @@
return self.dtype.getitem(self.storage, iter.get_offset())
def copy(self):
- array = NDimArray(self.size, self.shape[:], self.dtype, self.order)
+ array = W_NDimArray(self.size, self.shape[:], self.dtype, self.order)
rffi.c_memcpy(
array.storage,
self.storage,
@@ -1191,12 +1155,53 @@
shape.append(item)
return size, shape
+def array(space, w_item_or_iterable, w_dtype=None, w_order=NoneNotWrapped):
+ # find scalar
+ if not space.issequence_w(w_item_or_iterable):
+ if space.is_w(w_dtype, space.w_None):
+ w_dtype = interp_ufuncs.find_dtype_for_scalar(space,
+ w_item_or_iterable)
+ dtype = space.interp_w(interp_dtype.W_Dtype,
+ space.call_function(space.gettypefor(interp_dtype.W_Dtype),
w_dtype)
+ )
+ return scalar_w(space, dtype, w_item_or_iterable)
+ if w_order is None:
+ order = 'C'
+ else:
+ order = space.str_w(w_order)
+ if order != 'C': # or order != 'F':
+ raise operationerrfmt(space.w_ValueError, "Unknown order: %s",
+ order)
+ shape, elems_w = _find_shape_and_elems(space, w_item_or_iterable)
+ # they come back in C order
+ size = len(elems_w)
+ if space.is_w(w_dtype, space.w_None):
+ w_dtype = None
+ for w_elem in elems_w:
+ w_dtype = interp_ufuncs.find_dtype_for_scalar(space, w_elem,
+ w_dtype)
+ if w_dtype is interp_dtype.get_dtype_cache(space).w_float64dtype:
+ break
+ if w_dtype is None:
+ w_dtype = space.w_None
+ dtype = space.interp_w(interp_dtype.W_Dtype,
+ space.call_function(space.gettypefor(interp_dtype.W_Dtype), w_dtype)
+ )
+ arr = W_NDimArray(size, shape[:], dtype=dtype, order=order)
+ shapelen = len(shape)
+ arr_iter = arr.start_iter(arr.shape)
+ for i in range(len(elems_w)):
+ w_elem = elems_w[i]
+ dtype.setitem(arr.storage, arr_iter.offset, dtype.coerce(space,
w_elem))
+ arr_iter = arr_iter.next(shapelen)
+ return arr
+
def zeros(space, w_size, w_dtype=None):
dtype = space.interp_w(interp_dtype.W_Dtype,
space.call_function(space.gettypefor(interp_dtype.W_Dtype), w_dtype)
)
size, shape = _find_size_and_shape(space, w_size)
- return space.wrap(NDimArray(size, shape[:], dtype=dtype))
+ return space.wrap(W_NDimArray(size, shape[:], dtype=dtype))
def ones(space, w_size, w_dtype=None):
dtype = space.interp_w(interp_dtype.W_Dtype,
@@ -1204,7 +1209,7 @@
)
size, shape = _find_size_and_shape(space, w_size)
- arr = NDimArray(size, shape[:], dtype=dtype)
+ arr = W_NDimArray(size, shape[:], dtype=dtype)
one = dtype.box(1)
arr.dtype.fill(arr.storage, one, 0, size)
return space.wrap(arr)
@@ -1216,9 +1221,9 @@
return w_arr.descr_dot(space, w_obj2)
BaseArray.typedef = TypeDef(
- 'numarray',
- __new__ = interp2app(descr_new_array),
-
+ 'ndarray',
+ __module__ = "numpypy",
+ __new__ = interp2app(BaseArray.descr__new__.im_func),
__len__ = interp2app(BaseArray.descr_len),
__getitem__ = interp2app(BaseArray.descr_getitem),
diff --git a/pypy/module/micronumpy/interp_support.py
b/pypy/module/micronumpy/interp_support.py
--- a/pypy/module/micronumpy/interp_support.py
+++ b/pypy/module/micronumpy/interp_support.py
@@ -9,7 +9,7 @@
@unwrap_spec(s=str)
def fromstring(space, s):
- from pypy.module.micronumpy.interp_numarray import NDimArray
+ from pypy.module.micronumpy.interp_numarray import W_NDimArray
length = len(s)
if length % FLOAT_SIZE == 0:
@@ -19,7 +19,7 @@
"string length %d not divisable by %d" % (length, FLOAT_SIZE)))
dtype = get_dtype_cache(space).w_float64dtype
- a = NDimArray(number, [number], dtype=dtype)
+ a = W_NDimArray(number, [number], dtype=dtype)
start = 0
end = FLOAT_SIZE
diff --git a/pypy/module/micronumpy/test/test_base.py
b/pypy/module/micronumpy/test/test_base.py
--- a/pypy/module/micronumpy/test/test_base.py
+++ b/pypy/module/micronumpy/test/test_base.py
@@ -1,6 +1,6 @@
from pypy.conftest import gettestobjspace
from pypy.module.micronumpy.interp_dtype import get_dtype_cache
-from pypy.module.micronumpy.interp_numarray import NDimArray, Scalar
+from pypy.module.micronumpy.interp_numarray import W_NDimArray, Scalar
from pypy.module.micronumpy.interp_ufuncs import (find_binop_result_dtype,
find_unaryop_result_dtype)
@@ -14,7 +14,7 @@
float64_dtype = get_dtype_cache(space).w_float64dtype
bool_dtype = get_dtype_cache(space).w_booldtype
- ar = NDimArray(10, [10], dtype=float64_dtype)
+ ar = W_NDimArray(10, [10], dtype=float64_dtype)
v1 = ar.descr_add(space, ar)
v2 = ar.descr_add(space, Scalar(float64_dtype, 2.0))
assert v1.signature is not v2.signature
@@ -23,7 +23,7 @@
v4 = ar.descr_add(space, ar)
assert v1.signature is v4.signature
- bool_ar = NDimArray(10, [10], dtype=bool_dtype)
+ bool_ar = W_NDimArray(10, [10], dtype=bool_dtype)
v5 = ar.descr_add(space, bool_ar)
assert v5.signature is not v1.signature
assert v5.signature is not v2.signature
@@ -33,7 +33,7 @@
def test_slice_signature(self, space):
float64_dtype = get_dtype_cache(space).w_float64dtype
- ar = NDimArray(10, [10], dtype=float64_dtype)
+ ar = W_NDimArray(10, [10], dtype=float64_dtype)
v1 = ar.descr_getitem(space, space.wrap(slice(1, 3, 1)))
v2 = ar.descr_getitem(space, space.wrap(slice(4, 6, 1)))
assert v1.signature is v2.signature
diff --git a/pypy/module/micronumpy/test/test_compile.py
b/pypy/module/micronumpy/test/test_compile.py
--- a/pypy/module/micronumpy/test/test_compile.py
+++ b/pypy/module/micronumpy/test/test_compile.py
@@ -1,6 +1,9 @@
+import py
-import py
-from pypy.module.micronumpy.compile import *
+from pypy.module.micronumpy.compile import (numpy_compile, Assignment,
+ ArrayConstant, FloatConstant, Operator, Variable, RangeConstant, Execute,
+ FunctionCall, FakeSpace)
+
class TestCompiler(object):
def compile(self, code):
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
@@ -1,7 +1,7 @@
import py
from pypy.module.micronumpy.test.test_base import BaseNumpyAppTest
-from pypy.module.micronumpy.interp_numarray import NDimArray, shape_agreement
+from pypy.module.micronumpy.interp_numarray import W_NDimArray, shape_agreement
from pypy.module.micronumpy import signature
from pypy.interpreter.error import OperationError
from pypy.conftest import gettestobjspace
@@ -28,18 +28,18 @@
return self.space.newtuple(args_w)
def test_strides_f(self):
- a = NDimArray(100, [10, 5, 3], MockDtype(), 'F')
+ a = W_NDimArray(100, [10, 5, 3], MockDtype(), 'F')
assert a.strides == [1, 10, 50]
assert a.backstrides == [9, 40, 100]
def test_strides_c(self):
- a = NDimArray(100, [10, 5, 3], MockDtype(), 'C')
+ a = W_NDimArray(100, [10, 5, 3], MockDtype(), 'C')
assert a.strides == [15, 3, 1]
assert a.backstrides == [135, 12, 2]
def test_create_slice_f(self):
space = self.space
- a = NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), 'F')
+ a = W_NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), 'F')
s = a.create_slice(space, [(3, 0, 0, 1)])
assert s.start == 3
assert s.strides == [10, 50]
@@ -58,7 +58,7 @@
def test_create_slice_c(self):
space = self.space
- a = NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), 'C')
+ a = W_NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), 'C')
s = a.create_slice(space, [(3, 0, 0, 1)])
assert s.start == 45
assert s.strides == [3, 1]
@@ -78,7 +78,7 @@
def test_slice_of_slice_f(self):
space = self.space
- a = NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), 'F')
+ a = W_NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), 'F')
s = a.create_slice(space, [(5, 0, 0, 1)])
assert s.start == 5
s2 = s.create_slice(space, [(3, 0, 0, 1)])
@@ -96,7 +96,7 @@
def test_slice_of_slice_c(self):
space = self.space
- a = NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), order='C')
+ a = W_NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), order='C')
s = a.create_slice(space, [(5, 0, 0, 1)])
assert s.start == 15 * 5
s2 = s.create_slice(space, [(3, 0, 0, 1)])
@@ -114,7 +114,7 @@
def test_negative_step_f(self):
space = self.space
- a = NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), 'F')
+ a = W_NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), 'F')
s = a.create_slice(space, [(9, -1, -2, 5)])
assert s.start == 9
assert s.strides == [-2, 10, 50]
@@ -122,14 +122,14 @@
def test_negative_step_c(self):
space = self.space
- a = NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), order='C')
+ a = W_NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), order='C')
s = a.create_slice(space, [(9, -1, -2, 5)])
assert s.start == 135
assert s.strides == [-30, 3, 1]
assert s.backstrides == [-120, 12, 2]
def test_index_of_single_item_f(self):
- a = NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), 'F')
+ a = W_NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), 'F')
r = a._index_of_single_item(self.space, self.newtuple(1, 2, 2))
assert r == 1 + 2 * 10 + 2 * 50
s = a.create_slice(self.space, [(0, 10, 1, 10), (2, 0, 0, 1)])
@@ -139,7 +139,7 @@
assert r == a._index_of_single_item(self.space, self.newtuple(1, 2, 1))
def test_index_of_single_item_c(self):
- a = NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), 'C')
+ a = W_NDimArray(10 * 5 * 3, [10, 5, 3], MockDtype(), 'C')
r = a._index_of_single_item(self.space, self.newtuple(1, 2, 2))
assert r == 1 * 3 * 5 + 2 * 3 + 2
s = a.create_slice(self.space, [(0, 10, 1, 10), (2, 0, 0, 1)])
@@ -160,6 +160,21 @@
class AppTestNumArray(BaseNumpyAppTest):
+ def test_ndarray(self):
+ from numpypy import ndarray, array, dtype
+
+ assert type(ndarray) is type
+ assert type(array) is not type
+ a = ndarray((2, 3))
+ assert a.shape == (2, 3)
+ assert a.dtype == dtype(float)
+
+ raises(TypeError, ndarray, [[1], [2], [3]])
+
+ a = ndarray(3, dtype=int)
+ assert a.shape == (3,)
+ assert a.dtype is dtype(int)
+
def test_type(self):
from numpypy import array
ar = array(range(5))
@@ -359,11 +374,11 @@
assert r[i] == i + 3
def test_add_list(self):
- from numpypy import array
+ from numpypy import array, ndarray
a = array(range(5))
b = list(reversed(range(5)))
c = a + b
- assert isinstance(c, array)
+ assert isinstance(c, ndarray)
for i in range(5):
assert c[i] == 4
diff --git a/pypy/module/micronumpy/test/test_ufuncs.py
b/pypy/module/micronumpy/test/test_ufuncs.py
--- a/pypy/module/micronumpy/test/test_ufuncs.py
+++ b/pypy/module/micronumpy/test/test_ufuncs.py
@@ -37,36 +37,36 @@
assert minimum(2.0, 3.0) == 2.0
def test_sequence(self):
- from numpypy import array, negative, minimum
+ from numpypy import array, ndarray, negative, minimum
a = array(range(3))
b = [2.0, 1.0, 0.0]
c = 1.0
b_neg = negative(b)
- assert isinstance(b_neg, array)
+ assert isinstance(b_neg, ndarray)
for i in range(3):
assert b_neg[i] == -b[i]
min_a_b = minimum(a, b)
- assert isinstance(min_a_b, array)
+ assert isinstance(min_a_b, ndarray)
for i in range(3):
assert min_a_b[i] == min(a[i], b[i])
min_b_a = minimum(b, a)
- assert isinstance(min_b_a, array)
+ assert isinstance(min_b_a, ndarray)
for i in range(3):
assert min_b_a[i] == min(a[i], b[i])
min_a_c = minimum(a, c)
- assert isinstance(min_a_c, array)
+ assert isinstance(min_a_c, ndarray)
for i in range(3):
assert min_a_c[i] == min(a[i], c)
min_c_a = minimum(c, a)
- assert isinstance(min_c_a, array)
+ assert isinstance(min_c_a, ndarray)
for i in range(3):
assert min_c_a[i] == min(a[i], c)
min_b_c = minimum(b, c)
- assert isinstance(min_b_c, array)
+ assert isinstance(min_b_c, ndarray)
for i in range(3):
assert min_b_c[i] == min(b[i], c)
min_c_b = minimum(c, b)
- assert isinstance(min_c_b, array)
+ assert isinstance(min_c_b, ndarray)
for i in range(3):
assert min_c_b[i] == min(b[i], c)
diff --git a/pypy/module/micronumpy/test/test_zjit.py
b/pypy/module/micronumpy/test/test_zjit.py
--- a/pypy/module/micronumpy/test/test_zjit.py
+++ b/pypy/module/micronumpy/test/test_zjit.py
@@ -11,7 +11,7 @@
from pypy.module.micronumpy import interp_boxes, interp_ufuncs, signature
from pypy.module.micronumpy.compile import (numpy_compile, FakeSpace,
FloatObject, IntObject, BoolObject, Parser, InterpreterState)
-from pypy.module.micronumpy.interp_numarray import (NDimArray, NDimSlice,
+from pypy.module.micronumpy.interp_numarray import (W_NDimArray, NDimSlice,
BaseArray)
from pypy.rlib.nonconst import NonConstant
from pypy.rpython.annlowlevel import llstr, hlstr
@@ -352,7 +352,7 @@
dtype = float64_dtype
else:
dtype = int32_dtype
- ar = NDimArray(n, [n], dtype=dtype)
+ ar = W_NDimArray(n, [n], dtype=dtype)
i = 0
while i < n:
ar.get_concrete().setitem(i, int32_dtype.box(7))
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit