[Numpy-discussion] Further comments
Edward C. Jones
edcjones at erols.com
Sat Dec 28 09:52:23 EST 2002
Should the variable "type" be used in numarray? It is an important
function in Python.
---------------------------------------
There needs to be a function or method that returns the number of
elements in an array.
def Elements(array):
"""Number of elements in an array.
This version is slow.
"""
return numarray.multiply.reduce(array.shape)
---------------------------------------
I write code using both PIL and numarray. PIL uses strings for modes and
numarray uses (optionally) strings as typecodes. This causes problems.
One fix is to emit a DeprecationWarning when string typecodes are used.
Two functions are needed: StringTypeWarningOn and StringTypeWarningOff.
The default should be to ignore this warning.
In my code I use the following workarounds:
def SameType(x, y):
"""Are the two input the same object of NumericType?"""
if isinstance(x, NumericType) and isinstance(y, NumericType) \
and x == y:
return True
return False
def IsTypeInList(typecode, seq):
"""Is a NumericType object in a list of NumericType objects?"""
if not isinstance(typecode, NumericType):
return False
for item in seq:
if isinstance(item, NumericType) and typecode == item:
return True
return False
---------------------------------------
The following function is useful for downsizing arrays. I suggest that
it should be a ufunc method. This is how I have used reduceat in Numeric.
def blockreduce(array, blocksizes, ufunc):
"""Apply ufunc.reduce to blocks in an array."""
dims = len(array.shape)
if type(blocksizes) is IntType:
blocksizes = dims * [blocksizes]
if len(blocksizes) != dims:
raise TypeError, 'blocksizes must be same length as shape'
for i in range(dims):
if array.shape[i] % blocksizes[i] != 0:
raise ValueError, 'blocksizes must exactly divide ' \
'the corresponding array dimension'
for i in range(dims):
array = array.copy()
newshape = (array.shape[0] / blocksizes[i], blocksizes[i]) + \
array.shape[1:]
array.shape = newshape
array = ufunc.reduce(array, 1)
dims = len(array.shape)
# (0,1,2,3) --> (1,2,3,0)
perm = tuple(range(1, dims)) + (0,)
array = numarray.transpose(array, perm)
return array
More information about the NumPy-Discussion
mailing list