3

本当にばかげた質問ですが、私は正しい方法を理解できませんでした。

  1. Aは2x2の行列で、Bは2x1の行列です。
  2. 10回の反復ループでは、B_new = A*Bです。B_newは2x1です。
  3. 各反復後に、B_newを出力行列B_finalに保存します。したがって、最終的に、B_finalは2x10になります。

ただし、ループ内で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()

エラーメッセージが役に立たないことに気付いたのはあなただけではありません。誰かがこれについて約1年前にチケットを提出しました。

于 2012-07-24T06:47:41.160 に答える