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:

>

> (E-Mail Removed)

>

>

> 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