numpy migration (also posted to numpy-discussion)
Duncan Smith
buzzard at urubu.freeserve.co.uk
Tue Apr 24 21:36:02 EDT 2007
Travis E. Oliphant wrote:
> Duncan Smith wrote:
>
>> Hello,
>> Since moving to numpy I've had a few problems with my existing
>> code. It basically revolves around the numpy scalar types. e.g.
>>
>
> You will probably get more help on the numpy discussion list:
>
> numpy-discussion at scipy.org
>
>
> You are encountering problems because numpy scalar types don't raise
> errors (unless you have set the appropriate hardware flag using
> numpy.seterr).
>
Unfortunately it seems to raise a FloatingPointError.
>>> import numpy as N
>>> N.__version__
'1.0.1'
>>> a = N.array([[0,1],[2,3]])
>>> a
array([[0, 1],
[2, 3]])
>>> i = a[0,0]
>>> 1/i
0
>>> N.seterr(divide='raise')
{'over': 'print', 'divide': 'print', 'invalid': 'print', 'under': 'ignore'}
>>> 1/i
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
1/i
FloatingPointError: divide by zero encountered in long_scalars
> You can get Python scalars out of NumPy arrays if you really want them
> using (for example...)
>
> a.item(0,0)
>
>
>>
>> An additional problem involves classes that have e.g. __rmul__ methods
>> defined and are sufficiently similar to numpy arrays that my classes'
>> __rmul__ methods are not invoked when using numpy scalars.
>>
>
> Could you please post an example showing the problem?
>
[snip]
-----------------example.py--------------------
from __future__ import division
import numpy
class MyClass(object):
def __init__(self, arr, labels):
self.arr = arr
self.labels = labels
def __repr__(self):
return numpy.array2string(self.arr, separator=', ') +
repr(self.labels)
def __len__(self):
return len(self.labels)
def __getitem__(self, key):
return self.arr[key]
def __setitem__(self, key, item):
self.arr[key] = item
def __mul__(self, other):
return self.__class__(self.arr * other, self.labels)
__rmul__ = __mul__
----------------------------------------------------
>>> import example
>>> import numpy as N
>>> ex = example.MyClass(N.array([[6,7],[8,9]]), ['axis0', 'axis1'])
>>> i = ex.arr[0,0]
>>> ex
[[6, 7],
[8, 9]]['axis0', 'axis1']
>>> ex * i
[[36, 42],
[48, 54]]['axis0', 'axis1']
>>> i * ex
array([[36, 42],
[48, 54]])
>>>
It seems that it requires having __len__, __setitem__ and __getitem__
defined to get the undesired behaviour. Cheers.
Duncan
More information about the Python-list
mailing list