[Numpy-discussion] ufunc.accumulate question

Chris Withers chris at simplistix.co.uk
Tue Oct 5 08:53:22 EDT 2010


Hi All,

I can't find any docs on this behavior.

So, I have a python function. To keep it simple, lets just do addition:

def add(x,y):
   print x,y
   retun x+y

So, I can turn this into a ufunc as follows:

uadd = np.frompyfunc(add,2,1)

Now, I can apply it to an array:

 >>> uadd.accumulate(np.arange(3,10))
3 4
7 5
12 6
18 7
25 8
33 9
array([3, 7, 12, 18, 25, 33, 42], dtype=object)

Okay, but where did the initial 3 come from?
http://docs.scipy.org/doc/numpy/reference/generated/numpy.ufunc.accumulate.html#numpy.ufunc.accumulate 
suggests that:

r = np.empty(len(A))
t = op.identity        # op = the ufunc being applied to A's  elements
for i in xrange(len(A)):
     t = op(t, A[i])
     r[i] = t
return r

...but:

 >>> print uadd.identity
None

...and:

 >>> add(None,3)
None 3
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "<stdin>", line 3, in add
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

So, where is the reason that the 3 ends up in the output array documented?

Also, what if I want to specify the identity of my newly created ufunc?
I have a case where I want to specify it as zero:

 >>> uadd.identity = 0
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: attribute 'identity' of 'numpy.ufunc' objects is not 
writable

Any help gratefully received!

Chris



More information about the NumPy-Discussion mailing list