3

一个非常愚蠢的问题,但我想不出正确的方法..

  1. A 是 2 × 2 矩阵,B 是 2 × 1 矩阵。
  2. 在 10 次迭代循环中,B_new=A*B。B_new 是 2 乘 1。
  3. 每次迭代后将 B_new 保存到输出矩阵 B_final。所以最后,B_final 是 2 乘 10。

但是,我在循环中将 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
4

1 回答 1

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()

您并不是唯一一个发现错误消息没有帮助的人。大约一年前,有人为此提出了投诉。

于 2012-07-24T06:47:41.160 回答