python numpy ValueError: operand tidak dapat disiarkan bersama dengan bentuk


129

Dalam numpy, saya memiliki dua "array", Xadalah (m,n)dan ymerupakan vektor(n,1)

menggunakan

X*y

Saya mendapatkan kesalahan

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

Kapan (97,2)x(2,1)jelas operasi matriks hukum dan harus memberi saya (97,1)vektor

EDIT:

Saya telah mengoreksi ini menggunakan X.dot(y)tetapi pertanyaan asli masih ada.


2
Apa itu "pertanyaan asli"? X*yseharusnya tidak bekerja (dan tidak), tetapi np.dot(X,y)dan X.dot(y))harus berhasil (dan bagi saya mereka berhasil).
DSM

3
*bukan perkalian matriks untuk ndarrayobjek.
user2357112 mendukung Monica

Saya mendapat masalah yang sama ketika menyelesaikan wT * X, ketika ini seharusnya np.dot (wT, X)
Juan Zamora

X * y melakukan perkalian bijak elemen
Victor Zuanazzi

Jawaban:


93

dotadalah perkalian matriks, tetapi *melakukan hal lain.

Kami memiliki dua array:

  • X, bentuk (97,2)
  • y, bentuk (2,1)

Dengan array Numpy, operasinya

X * y

dilakukan berdasarkan elemen, tetapi satu atau kedua nilai dapat diperluas dalam satu atau beberapa dimensi untuk membuatnya kompatibel. Operasi ini disebut penyiaran. Dimensi dengan ukuran 1 atau yang hilang dapat digunakan dalam penyiaran.

Dalam contoh di atas dimensi tidak sesuai, karena:

97   2
 2   1

Di sini ada angka-angka yang saling bertentangan di dimensi pertama (97 dan 2). Itulah yang dikeluhkan ValueError di atas. Dimensi kedua akan baik-baik saja, karena nomor 1 tidak bertentangan dengan apa pun.

Untuk informasi lebih lanjut tentang aturan penyiaran: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

(Perlu diketahui bahwa jika Xdan ybertipe numpy.matrix, maka tanda bintang dapat digunakan sebagai perkalian matriks. Rekomendasi saya adalah menjauhinumpy.matrix , ini cenderung mempersulit lebih dari sekedar menyederhanakan.)

Array Anda harus baik-baik saja dengan numpy.dot; jika Anda mendapatkan kesalahan numpy.dot, Anda pasti memiliki bug lain. Jika bentuknya salah numpy.dot, Anda mendapatkan pengecualian yang berbeda:

ValueError: matrices are not aligned

Jika Anda masih mendapatkan kesalahan ini, harap posting contoh masalah minimal. Contoh perkalian dengan array berbentuk seperti milik Anda berhasil:

In [1]: import numpy

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

34

Per dokumen numpy :

Saat beroperasi pada dua larik, NumPy membandingkan bentuknya berdasarkan elemen. Ini dimulai dengan dimensi trailing, dan terus berlanjut. Dua dimensi kompatibel jika:

  • mereka sama, atau
  • salah satunya adalah 1

Dengan kata lain, jika Anda mencoba mengalikan dua matriks (dalam pengertian aljabar linier) maka Anda menginginkannya, X.dot(y)tetapi jika Anda mencoba untuk menyiarkan skalar dari matriks yke, Xmaka Anda perlu melakukanX * y.T .

Contoh:

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

Mungkin saja kesalahan tidak terjadi pada produk titik, tetapi setelahnya. Misalnya coba ini

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) akan baik-baik saja; Namun np.dot (a, b) * c jelas salah (12x1 X 1x5 = 12x5 yang tidak dapat mengalikan elemen 5x12) tetapi numpy akan memberi Anda

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

Kesalahannya menyesatkan; namun ada masalah di jalur itu.


1
Pesan kesalahan memang menyesatkan, karena ini tampaknya muncul ketika dimensi matriks Anda salah untuk perkalian bijak.
Aung Htet


7

Anda sedang mencari np.matmul(X, y). Dengan Python 3.5+, Anda dapat menggunakan X @ y.


0

Kita mungkin bingung sendiri bahwa a * b adalah perkalian titik.

Tapi nyatanya, itu disiarkan.

Produk titik : Perkalian Titik a.dot (b)

Siaran:

Istilah penyiaran mengacu pada bagaimana numpy memperlakukan array dengan dimensi berbeda selama operasi aritmatika yang mengarah pada batasan tertentu, array yang lebih kecil disiarkan melalui array yang lebih besar sehingga memiliki bentuk yang kompatibel.

(m, n) + - / * (1, n) → (m, n): operasi akan diterapkan ke m baris

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.