http://stackoverflow.com/questions/11625412/add-a-vector-to-array
A really stupid question, but I could not figure the right way..
However, I have problem of adding B to B_new in a loop. Below is my code, can anyone give me some suggestions?
import numpy as np a=np.ones(shape=(2,2)) b=np.ones(shape=(2,1)) c_final=np.zeros(shape=(2,10))for i in range(0,10): c=np.dot(a,b) b=c c_final[:,i]=c
Here is the error message:
c_final[:,i]=c ValueError: output operand requires a reduction, but reduction isnot enabled
The error you're seeing is because when numpy broadcasts c_final[:,i]
and np.dot(a,b)
together it produces an array with shape (2,2)
, which then can't be assigned to c_final[:,i]
since it has a shape of (2,1)
. I think it's much clearer if you just play around with it in the interpreter:
>>>import numpy as np >>> a = np.ones((2,2))>>> b = np.ones((2,1))>>> c_final = np.zeros((2,10))>>> np.dot(a,b) array([[2.],[2.]])>>> np.dot(a,b).shape (2,1)>>> c_final[:,0] array([0.,0.])>>> c_final[:,0].shape (2,)>>> np.broadcast(c_final[:,0],np.dot(a,b)).shape (2,2)
The way around this is to flatten np.dot(a,b)
by using np.squeeze
or something similar so that when they are broadcast together they produce a 2 element array. For example:
>>> c_final[:,0]= np.dot(a,b).squeeze()
You're not alone in finding the error message unhelpful. Someone filed a ticket about this about a year ago.