python numpy ValueError:オペランドは形状と一緒にブロードキャストできませんでした


128

numpyでは、2つの「配列」X(m,n)あり、is とyvectorです。(n,1)

を使用して

X*y

エラーが出ます

ValueError: operands could not be broadcast together with shapes (97,2) (2,1) 

ときに (97,2)x(2,1)明確に法的な行列演算であると私に与えるべきである(97,1)ベクトルを

編集:

私はこれを使用して修正しましたX.dot(y)が、元の質問はまだ残っています。


2
「元の質問」とは何ですか? X*y動作しないはずです(動作しません)がnp.dot(X,y)、動作するX.dot(y))はずです(そして私にとっては動作します)。
DSM

3
*ndarrayオブジェクトの行列乗算ではありません。
user2357112は、14:22にモニカ

これがnp.dot(wT、X)になるはずのwT * Xを解くときに同じ問題が発生しました
Juan Zamora

X * yは要素ごとの乗算を行います
Victor Zuanazzi

回答:


92

dot行列乗算ですが、*他のことをします。

2つの配列があります。

  • X、形状(97,2)
  • y、形状(2,1)

Numpy配列では、操作

X * y

要素ごとに行われますが、1つまたは両方の値を1つまたは複数の次元に展開して、互換性を持たせることができます。この操作をブロードキャストと呼びます。サイズが1または不足している寸法は、ブロードキャストで使用できます。

上記の例では、次の理由により、寸法に互換性がありません。

97   2
 2   1

ここでは、最初の次元(97と2)に矛盾する数値があります。それが上記のValueErrorが不満を言っていることです。2番目の次元は、1は何とも競合しないため、問題ありません。

ブロードキャストルールの詳細:http : //docs.scipy.org/doc/numpy/user/basics.broadcasting.html

Xyのタイプの場合、numpy.matrix行列の乗算としてアスタリスクを使用できることに注意してください。私の推奨事項は、を避けてくださいnumpy.matrix。単純化よりも複雑になる傾向があります。)

あなたの配列はnumpy.dot; でエラーが発生したnumpy.dot場合は、他のバグがいくつかあるはずです。の形状がの場合、numpy.dot別の例外が発生します。

ValueError: matrices are not aligned

それでもこのエラーが発生する場合は、問題の最小限の例を投稿してください。あなたのような形の配列を使った乗算の例は成功します:

In [1]: import numpy

In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)

34

numpy docsごと:

2つの配列を操作する場合、NumPyはそれらの形状を要素ごとに比較します。それは後続の次元から始まり、前進します。次の場合、2つの次元は互換性があります。

  • 彼らは等しい、または
  • それらの1つは1

言い換えれば、あなたは(線形代数の意味での)乗算二つの行列にしようとしているならば、あなたはしたいX.dot(y)が、あなたは、マトリックスからの放送スカラーしようとしている場合yX、あなたが実行する必要がありますX * y.T

例:

>>> import numpy as np
>>>
>>> X = np.arange(8).reshape(4, 2)
>>> y = np.arange(2).reshape(1, 2)  # create a 1x2 matrix
>>> X * y
array([[0,1],
       [0,3],
       [0,5],
       [0,7]])

11

ドット積ではエラーが発生しなかった可能性がありますが、その後です。たとえばこれを試してください

a = np.random.randn(12,1)
b = np.random.randn(1,5)
c = np.random.randn(5,12)
d = np.dot(a,b) * c

np.dot(a、b)は問題ありません。ただし、np.dot(a、b)* cは明らかに間違っています(12x1 X 1x5 = 12x5で、要素ごとに5x12を乗算することはできません)。

ValueError: operands could not be broadcast together with shapes (12,1) (1,5)

エラーは誤解を招くものです。ただし、その行には問題があります。


1
このエラーメッセージは確かに誤解を招くものです。これは、行列の次元が要素ごとの乗算で間違っている場合に表示されるように見えるためです。
Aung Htet

7

を使用してくださいnp.mat(x) * np.mat(y)。これでうまくいきます。


7

あなたが探していnp.matmul(X, y)ます。Python 3.5以降ではを使用できますX @ y


0

a * bはドット積であると混乱するかもしれません。

しかし、実際には、それは放送されています。

ドット積: a.dot(b)

放送:

ブロードキャストという用語は、特定の制約につながる算術演算中にnumpyが異なる次元の配列をどのように扱うかを指します。互換性のある形状を持つように、小さい配列が大きい配列全体にブロードキャストされます。

(m、n)+-/ *(1、n)→(m、n):操作はm行に適用されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.