python numpy ValueError: operanden konden niet samen met vormen worden uitgezonden

In numpy heb ik twee “arrays”, Xis (m,n)en yis een vector (n,1)

met

X*y

Ik krijg de foutmelding

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

Als (97,2)x(2,1)duidelijk een legale matrixbewerking is en mij een (97,1)vector

moet geven

BEWERKEN:

Ik heb dit gecorrigeerd met X.dot(y)maar de oorspronkelijke vraag blijft bestaan.


Antwoord 1, autoriteit 100%

dotis matrixvermenigvuldiging, maar *doet iets anders.

We hebben twee arrays:

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

Met Numpy-arrays is de bewerking

X * y

wordt elementsgewijs gedaan, maar een of beide waarden kunnen worden uitgebreid in een of meer dimensies om ze compatibel te maken. Deze operatie wordt broadcasting genoemd. Afmetingen, waar maat 1 is of die ontbreken, kunnen worden gebruikt bij uitzendingen.

In het bovenstaande voorbeeld zijn de afmetingen niet compatibel, omdat:

97   2
 2   1

Hier zijn er conflicterende getallen in de eerste dimensie (97 en 2). Dat is waar de ValueError hierboven over klaagt. De tweede dimensie zou goed zijn, aangezien nummer 1 nergens mee in strijd is.

Voor meer informatie over uitzendregels: http://docs.scipy .org/doc/numpy/user/basics.broadcasting.html

(Houd er rekening mee dat als Xen yvan het type numpy.matrixzijn, het sterretje kan worden gebruikt als matrixvermenigvuldiging. Mijn aanbeveling is om weg te blijven van numpy.matrix, het heeft de neiging om meer te compliceren dan dingen te vereenvoudigen.)

Je arrays zouden in orde moeten zijn met numpy.dot; als je een foutmelding krijgt op numpy.dot, moet je een andere bug hebben. Als de vormen verkeerd zijn voor numpy.dot, krijg je een andere uitzondering:

ValueError: matrices are not aligned

Als je deze foutmelding nog steeds krijgt, post dan een minimaal voorbeeld van het probleem. Een voorbeeldvermenigvuldiging met arrays in de vorm van de jouwe slaagt:

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

Antwoord 2, autoriteit 35%

Per numpy documenten:

Als NumPy op twee arrays werkt, vergelijkt ze hun vormen elementsgewijs. Het begint met de achterliggende dimensies en werkt zich een weg naar voren. Twee dimensies zijn compatibel wanneer:

  • ze zijn gelijk, of
  • een van hen is 1

Met andere woorden, als je twee matrices probeert te vermenigvuldigen (in de zin van lineaire algebra), dan wil je X.dot(y)maar als je scalaires probeert uit te zenden vanuit matrix yop X, dan moet je X * y.Tuitvoeren.

Voorbeeld:

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

Antwoord 3, Autoriteit 14%

U zoekt np.matmul(X, y). In Python 3.5+ kunt u X @ ygebruiken.


Antwoord 4, Autoriteit 11%

Het is mogelijk dat de fout niet in het puntproduct voordoet, maar daarna.
Probeer dit bijvoorbeeld

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)komt goed; Maar np.dot(a, b) * cis duidelijk verkeerd (12x1 X 1x5 = 12x5die niet mag vermenigvuldigen 5x12) maar Numpy geeft je

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

De fout is misleidend; Er is echter een probleem op die lijn.


Antwoord 5, Autoriteit 7%

Gebruik np.mat(x) * np.mat(y), DAT WERKT.


Antwoord 6

We kunnen onszelf verwarren dat a * b een dot-product is.

Maar in feite wordt het uitgezonden.

Dot Product:
a.dot (b)

uitzending:

De term omroep verwijst naar hoe numpy reacties met verschillende behandelt
dimensies tijdens rekenkundige bewerkingen die tot zekerheid leiden
Constrafen, de kleinere array wordt over de grotere array uitgezonden, dus
dat ze compatibele vormen hebben.

(m, n) + – / * (1, n) → (m, n): de bewerking wordt toegepast op M-rijen


Antwoord 7

Converteer de arrays naar matrices en voer vervolgens de vermenigvuldiging uit.

X = np.matrix(X)
y = np.matrix(y)
X*y

Antwoord 8

ValueError: operands could not be broadcast together with shapes (x ,y) (a ,b)
where  x ,y are variables
Basically this error occurred when value of y (no. of columns) doesn't equal to the number of elements in another multidimensional array.
Now let's go through by ex=>
coding  apart
    {
        import numpy as np 
        arr1= np.arange(12).reshape(3,4)
    }
output of arr1
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
    {   arr2= np.arange(4).reshape(1,4)
          or                   { both are same 1 rows and 4 columns
        arr2= np.arange(4)
    }
ouput of arr2=>
array([0, 1, 2, 3])
no of elements in arr2 is equal no of no. of the columns in arr1 it will be excute.
    {
    for x,y in np.nditer([a,b]):
        print(x,y)
    }
output => 0 0
1 1
2 2
3 3
4 0
5 1
6 2
7 3
8 0
9 1
10 2
11 3

Other episodes