一个非常愚蠢的问题,但我想不出正确的方法..
但是,我有一个循环中将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
Run Code Online (Sandbox Code Playgroud)
这是错误消息:
c_final[:,i]=c
ValueError: output operand requires a reduction, but reduction is not enabled
Run Code Online (Sandbox Code Playgroud)
你看到的错误是因为当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)
Run Code Online (Sandbox Code Playgroud)
解决这个问题的方法是np.dot(a,b)通过使用np.squeeze或类似的东西来平坦化,以便当它们一起广播时产生2元素阵列.例如:
>>> c_final[:,0] = np.dot(a,b).squeeze()
Run Code Online (Sandbox Code Playgroud)
您并不是唯一一个发现错误消息无益的人.有人提出了票这个大约一年前.