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: > > [EMAIL PROTECTED] > > > 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 -- http://mail.python.org/mailman/listinfo/python-list