Author: mattip <[email protected]>
Branch: nditer-external_loop
Changeset: r74287:d98fffa77488
Date: 2014-10-12 12:37 +0200
http://bitbucket.org/pypy/pypy/changeset/d98fffa77488/
Log: create convenience function (grafted from
2d560d9000bbfa471866ca11821cda028759e53d)
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
@@ -83,8 +83,12 @@
raise OperationError(space.w_AttributeError, space.wrap(
"Cannot delete array dtype"))
+ def ndims(self):
+ return len(self.get_shape())
+ ndims._always_inline_ = True
+
def descr_get_ndim(self, space):
- return space.wrap(len(self.get_shape()))
+ return space.wrap(self.ndims())
def descr_get_itemsize(self, space):
return space.wrap(self.get_dtype().elsize)
@@ -103,14 +107,14 @@
return space.wrap(loop.tostring(space, self))
def getitem_filter(self, space, arr):
- if len(arr.get_shape()) > 1 and arr.get_shape() != self.get_shape():
+ if arr.ndims() > 1 and arr.get_shape() != self.get_shape():
raise OperationError(space.w_ValueError, space.wrap(
"boolean index array should have 1 dimension"))
if arr.get_size() > self.get_size():
raise OperationError(space.w_ValueError, space.wrap(
"index out of range for array"))
size = loop.count_all_true(arr)
- if len(arr.get_shape()) == 1:
+ if arr.ndims() == 1:
res_shape = [size] + self.get_shape()[1:]
else:
res_shape = [size]
@@ -119,7 +123,7 @@
return loop.getitem_filter(w_res, self, arr)
def setitem_filter(self, space, idx, val):
- if len(idx.get_shape()) > 1 and idx.get_shape() != self.get_shape():
+ if idx.ndims() > 1 and idx.get_shape() != self.get_shape():
raise OperationError(space.w_ValueError, space.wrap(
"boolean index array should have 1 dimension"))
if idx.get_size() > self.get_size():
@@ -210,7 +214,7 @@
if space.is_w(w_idx, space.w_Ellipsis):
return self
elif isinstance(w_idx, W_NDimArray) and w_idx.get_dtype().is_bool() \
- and len(w_idx.get_shape()) > 0:
+ and w_idx.ndims() > 0:
return self.getitem_filter(space, w_idx)
try:
return self.implementation.descr_getitem(space, self, w_idx)
@@ -228,7 +232,7 @@
self.implementation.setslice(space, convert_to_array(space,
w_value))
return
elif isinstance(w_idx, W_NDimArray) and w_idx.get_dtype().is_bool() \
- and len(w_idx.get_shape()) > 0:
+ and w_idx.ndims() > 0:
self.setitem_filter(space, w_idx, convert_to_array(space, w_value))
return
try:
@@ -289,7 +293,7 @@
shape=shape, backward_broadcast=backward_broadcast)
def is_scalar(self):
- return len(self.get_shape()) == 0
+ return self.ndims() == 0
def set_scalar_value(self, w_val):
return self.implementation.setitem(self.implementation.start, w_val)
@@ -408,7 +412,7 @@
"""
if axis1 == axis2:
return self
- n = len(self.get_shape())
+ n = self.ndims()
if n <= 1:
return self
if axis1 < 0:
@@ -426,7 +430,7 @@
return self.implementation.nonzero(space, index_type)
def descr_tolist(self, space):
- if len(self.get_shape()) == 0:
+ if self.ndims() == 0:
return self.get_scalar_value().item(space)
l_w = []
for i in range(self.get_shape()[0]):
@@ -515,7 +519,7 @@
if len(args_w) == 0:
raise OperationError(space.w_ValueError, space.wrap(
"itemset must have at least one argument"))
- if len(args_w) != len(self.get_shape()) + 1:
+ if len(args_w) != self.ndims() + 1:
raise OperationError(space.w_ValueError, space.wrap(
"incorrect number of indices for array"))
self.descr_setitem(space, space.newtuple(args_w[:-1]), args_w[-1])
@@ -648,14 +652,14 @@
@unwrap_spec(offset=int, axis1=int, axis2=int)
def descr_diagonal(self, space, offset=0, axis1=0, axis2=1):
- if len(self.get_shape()) < 2:
+ if self.ndims() < 2:
raise OperationError(space.w_ValueError, space.wrap(
"need at least 2 dimensions for diagonal"))
- if (axis1 < 0 or axis2 < 0 or axis1 >= len(self.get_shape()) or
- axis2 >= len(self.get_shape())):
+ if (axis1 < 0 or axis2 < 0 or axis1 >= self.ndims() or
+ axis2 >= self.ndims()):
raise oefmt(space.w_ValueError,
"axis1(=%d) and axis2(=%d) must be withing range "
- "(ndim=%d)", axis1, axis2, len(self.get_shape()))
+ "(ndim=%d)", axis1, axis2, self.ndims())
if axis1 == axis2:
raise OperationError(space.w_ValueError, space.wrap(
"axis1 and axis2 cannot be the same"))
@@ -734,7 +738,7 @@
raise OperationError(space.w_NotImplementedError, space.wrap(
'sorter not supported in searchsort'))
side = searchside_converter(space, w_side)
- if len(self.get_shape()) != 1:
+ if self.ndims() != 1:
raise oefmt(space.w_ValueError, "a must be a 1-d array")
v = convert_to_array(space, w_v)
ret = W_NDimArray.from_shape(
@@ -973,7 +977,7 @@
if other.is_scalar():
#Note: w_out is not modified, this is numpy compliant.
return self.descr_mul(space, other)
- elif len(self.get_shape()) < 2 and len(other.get_shape()) < 2:
+ elif self.ndims() < 2 and other.ndims() < 2:
w_res = self.descr_mul(space, other)
assert isinstance(w_res, W_NDimArray)
return w_res.descr_sum(space, space.wrap(-1), out)
@@ -990,7 +994,7 @@
matches = False
elif not out.implementation.order == "C":
matches = False
- elif len(out.get_shape()) != len(out_shape):
+ elif out.ndims() != len(out_shape):
matches = False
else:
for i in range(len(out_shape)):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit