python numpy ValueError: işlenenler şekillerle birlikte yayınlanamaz


129

Numpy'de iki "dizi" Xvar (m,n)ve ybir vektör(n,1)

kullanma

X*y

Hata alıyorum

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

Ne zaman (97,2)x(2,1)açıkça yasal bir matris işlemi ve bana bir (97,1)vektör vermeli

DÜZENLE:

Bunu kullanarak düzelttim X.dot(y)ama asıl soru hala kalıyor.


2
"Orijinal soru" nedir? X*yişe (ve öyle değil), fakat olmamalıdır np.dot(X,y)ve X.dot(y))çalışması gerekir (ve benim için yaptıkları).
DSM

3
*ndarraynesneler için matris çarpımı değildir .
user2357112

WT * X'i çözerken bu np.dot (wT, X) olması gerektiğinde aynı problemle karşılaştım
Juan Zamora

X * y eleman bilge çarpma yapıyor
Victor Zuanazzi

Yanıtlar:


93

dotmatris çarpımıdır, ancak *başka bir şey yapar.

İki dizimiz var:

  • X, şekil (97,2)
  • y, şekil (2; 1)

Numpy dizileriyle, işlem

X * y

öğe bazında yapılır, ancak değerlerden biri veya her ikisi uyumlu hale getirmek için bir veya daha fazla boyutta genişletilebilir. Bu işleme yayın denir. Boyut 1 olan veya eksik olan boyutlar yayınlamada kullanılabilir.

Yukarıdaki örnekte boyutlar uyumsuzdur, çünkü:

97   2
 2   1

Burada birinci boyutta (97 ve 2) birbiriyle çelişen sayılar vardır. Yukarıdaki ValueError'ın şikayet ettiği şey budur. İkinci boyut, 1 numara hiçbir şeyle çelişmediği için tamam olacaktır.

Yayın kuralları hakkında daha fazla bilgi için: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

(Eğer not edin o Xve ytiptedir numpy.matrix, ardından yıldız matris çarpımı olarak kullanılabilir. Benim tavsiye uzak tutmaktır numpy.matrix, bu basitleştirmek şeyler daha karmaşık hale eğilimindedir.)

Dizileriniz numpy.dot; üzerinde bir hata numpy.dotalırsanız, başka bir hatanız olmalıdır. Şekiller yanlışsa numpy.dot, farklı bir istisna elde edersiniz:

ValueError: matrices are not aligned

Hala bu hatayı alıyorsanız, lütfen sorunun asgari bir örneğini gönderin. Sizinki gibi şekillendirilmiş dizilerle çarpma örneği başarılı olur:

In [1]: import numpy

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

34

Başına numpy docs :

İki dizi üzerinde çalışırken NumPy şekillerini eleman bazında karşılaştırır. Takip eden boyutlarla başlar ve ileriye doğru çalışır. İki boyut şu durumlarda uyumludur:

  • eşitler veya
  • bunlardan biri 1

Diğer bir deyişle, iki matrisi çarpmaya çalışıyorsanız (doğrusal cebir anlamında), o zaman istersiniz, X.dot(y)ancak matristen yüzerine skaler yayınlamaya çalışıyorsanız, Xo zaman gerçekleştirmeniz gerekir X * y.T.

Misal:

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

Hatanın nokta üründe değil sonra ortaya çıkması mümkündür. Örneğin şunu dene

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) yeterli olacaktır; ancak np.dot (a, b) * c açıkça yanlıştır (12x1 X 1x5 = 12x5, eleman açısından 5x12 ile çarpılamaz) ancak uyuşukluk size verecektir

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

Hata yanıltıcıdır; ancak bu hatta bir sorun var.


1
Hata mesajı gerçekten yanıltıcıdır, çünkü bu, matris boyutlarınız eleman bazlı çarpma için yanlış olduğunda ortaya çıkar.
Aung Htet


7

Sen arıyorsun np.matmul(X, y). Python 3.5+ ile kullanabilirsiniz X @ y.


0

A * b'nin bir iç çarpım olduğu konusunda kafamızı karıştırabiliriz.

Ama aslında yayınlanıyor.

Nokta Çarpımı : a.dot (b)

Yayın yapmak:

Yayın terimi, numpy'nin belirli kısıtlamalara yol açan aritmetik işlemler sırasında farklı boyutlara sahip dizileri nasıl ele aldığını ifade eder; daha küçük dizi, uyumlu şekillere sahip olmaları için daha büyük dizi boyunca yayınlanır.

(m, n) + - / * (1, n) → (m, n): işlem m satıra uygulanacaktır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.