一个非常愚蠢的问题,但我无法想出正确的方法......
但是,我在循环中将B添加到B_new有问题。以下是我的代码,有人可以给我一些建议吗?
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
以下是错误消息:
c_final[:,i]=c
ValueError: output operand requires a reduction, but reduction is not enabled
答案 0 :(得分:5)
您看到的错误是因为当numpy广播c_final[:,i]
和np.dot(a,b)
时,它会生成一个形状为(2,2)
的数组,然后无法将其分配给c_final[:,i]
,因为它的形状为(2,1)
。如果您只是在解释器中使用它,我认为它会更清楚:
>>> 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)
解决这个问题的方法是使用np.dot(a,b)
或类似的东西来展平np.squeeze
,这样当它们一起广播时会生成一个2元素数组。例如:
>>> c_final[:,0] = np.dot(a,b).squeeze()
您并不是唯一一个发现错误消息无益的人。大约一年前有人提出ticket这个问题。