Arraycasting problem.
Hi Herb,
It has taken awhile for me to respond to this, but your problem's here illustrate exactly the kinds of difficulties one encounters with the current NumPy coercion rules:
You do not have a bad version of Numeric. The behavior you describe is exactly what "should" happen though it needs to be fixed. I'll trace for you exactly what is going on as it could be illustrative to others:
a = zeros((5,5),'b')
# You've just created a 5x5 byte array that follows "normal" coercion # rules filled with zeros.
a[3,3] = 8
# This line copies the rank0 array of type 'b' created from the Python # Integer 8 (by a direct coercion in C) into element (3,3) of matrix a
temp = a[3,3]
# This selects out the rank0 array of typecode 'b' at position (3,3). As # of 15.2 this is nolonger changed to a scalar. Note that rank0 arrays # act alot like scalars, but because there is not a onetoone # correspondence between the Python Scalars and rank0 arrays, this is not # automatically converted to a Python scalar (this is a change in 15.2)
temp = temp + 3
# This is the problem line for you right here. Something is wrong though, # since it should not be, a problem. # You are adding a rank0 array of typecode 'b' to a Python Integer which # is interpreted by Numeric as a rank0 array of typecode 'l'. The result # should be a Python Integer. For some reason this is returning an array # of typecode 'i' (which does not get automatically converted to a Python # scalar).
a[3,3] = temp
# This would work fine if temp were the Python scalar it should be. # Right now, assignment doesn't let you assign an array of a "larger" type # to elements of a smaller type (except for Python scalars). Since temp # is (incorrectly I think) a type 'i' rank0 array, it does not let you # make the assignment. At any rate it is inconsistent to let you assign # Python scalars but not rank0 arrays of arbitrary precision, this should # be fixed. It is also a problem that temp + 3 returns an array of # typecode 'i'.
I will look into fixing the above problems this example points out. Of course, it could also be fixed by having long integers lower in the coercion tree than byte arrays.
Thanks for the feedback,
Travis Oliphant
participants (1)

Travis Oliphant