python numpy ValueError: gli operandi non potevano essere trasmessi insieme alle forme


129

In numpy, ho due "array", Xè (m,n)ed yè un vettore(n,1)

utilizzando

X*y

Ricevo l'errore

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

Quando (97,2)x(2,1)è chiaramente un'operazione a matrice legale e dovrebbe darmi un (97,1)vettore

MODIFICARE:

L'ho corretto utilizzando X.dot(y)ma la domanda originale rimane ancora.


2
Qual è la "domanda originale"? X*yNon dovrebbe funzionare (e non lo fa), ma np.dot(X,y)e X.dot(y))dovrebbe funzionare (e per me lo fanno).
DSM

3
*non è la moltiplicazione di matrici per gli ndarrayoggetti.
user2357112 supporta Monica

Ho avuto lo stesso problema quando ho risolto wT * X, quando questo dovrebbe essere np.dot (wT, X)
Juan Zamora

X * y fa la moltiplicazione degli elementi
Victor Zuanazzi

Risposte:


93

dotè la moltiplicazione di matrici, ma *fa qualcos'altro.

Abbiamo due array:

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

Con gli array Numpy, l'operazione

X * y

è fatto per elemento, ma uno o entrambi i valori possono essere espansi in una o più dimensioni per renderli compatibili. Questa operazione è chiamata trasmissione. Le dimensioni in cui la dimensione è 1 o mancanti possono essere utilizzate nella trasmissione.

Nell'esempio sopra le dimensioni sono incompatibili, perché:

97   2
 2   1

Qui ci sono numeri in conflitto nella prima dimensione (97 e 2). Questo è ciò di cui si lamenta ValueError sopra. La seconda dimensione andrebbe bene, poiché il numero 1 non è in conflitto con nulla.

Per ulteriori informazioni sulle regole di trasmissione: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

(Si noti che se Xe ysono di tipo numpy.matrix, allora l'asterisco può essere utilizzato come moltiplicazione di matrici. Il mio consiglio è di tenersi alla larga numpy.matrix, tende a complicare più che a semplificare le cose.)

I tuoi array dovrebbero andare bene con numpy.dot; se ricevi un errore numpy.dot, devi avere qualche altro bug. Se le forme sono sbagliate numpy.dot, ottieni un'eccezione diversa:

ValueError: matrices are not aligned

Se continui a ricevere questo errore, pubblica un esempio minimo del problema. Un esempio di moltiplicazione con array a forma di tuo riesce:

In [1]: import numpy

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

34

Per numpy documenti :

Quando si opera su due array, NumPy confronta le loro forme per elemento. Inizia con le dimensioni finali e prosegue. Due dimensioni sono compatibili quando:

  • sono uguali, o
  • uno di loro è 1

In altre parole, se stai tentando di moltiplicare due matrici (nel senso dell'algebra lineare), allora lo desideri, X.dot(y)ma se stai cercando di trasmettere scalari da matrice ya, Xallora devi eseguire X * y.T.

Esempio:

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

È possibile che l'errore non si sia verificato nel prodotto dot, ma dopo. Ad esempio, prova questo

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) andrà bene; tuttavia np.dot (a, b) * c è chiaramente sbagliato (12x1 X 1x5 = 12x5 che non può moltiplicare per elementi 5x12) ma numpy ti darà

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

L'errore è fuorviante; tuttavia c'è un problema su quella linea.


1
Il messaggio di errore è davvero fuorviante, poiché sembra apparire quando le dimensioni della matrice sono sbagliate per la moltiplicazione per elemento.
Aung Htet



0

Potremmo confonderci sul fatto che a * b sia un prodotto puntato.

Ma in effetti, viene trasmesso.

Prodotto puntino: a.dot (b)

Trasmissione:

Il termine broadcasting si riferisce al modo in cui numpy tratta array con dimensioni diverse durante operazioni aritmetiche che portano a determinati vincoli, l'array più piccolo viene trasmesso attraverso l'array più grande in modo che abbiano forme compatibili.

(m, n) + - / * (1, n) → (m, n): l'operazione verrà applicata a m righe

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.