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