Adăugarea tablouri cu număr diferit de dimensiuni

voturi
9

Să presupunem că am o matrice 2D NumPy:

>>> a = np.random.random((4,6))

și vreau să adăugați o matrice 1D la fiecare rând:

>>> c = np.random.random((6,))
>>> a + c

Acest lucru funcționează. Acum, dacă am încerca să adăugați o matrice 1D la fiecare coloană, I a lua o eroare:

>>> b = np.random.random((4,))
>>> a + b
Traceback (most recent call last):
  File <stdin>, line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape

Pot rezolva această problemă prin utilizarea np.newaxis:

>>> a + b[:,np.newaxis]

care funcționează conform așteptărilor.

Care sunt regulile forma de potrivire pentru a evita să utilizeze np.newaxis? Este că ultimul element al tuplul formă NumPy trebuie să se potrivească? Are această regulă se aplică, de asemenea, la dimensiuni mai mari? De exemplu, lucrările următoarele:

>>> a = np.random.random((2,3,4,5))
>>> b = np.random.random((4,5))
>>> a + b

Deci, întrebarea mea este dacă acest lucru este documentat oriunde, iar dacă acesta este un comportament care poate fi invocat, sau dacă cel mai bine este să utilizați întotdeauna np.newaxis?

Întrebat 20/01/2010 la 19:19
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
10

Aceasta este o trăsătură distinctivă a NumPy numit de radiodifuziune . Aceasta se face cu ajutorul a patru reguli care sunt un pic mai complicat în formulare , dar sunt mai degrabă intuitiv o dată înțeles:

  1. Toate matrice de intrare cu ndimmai mică decât cea mai mare gama de intrare ndim, au 1 lui prefixate la formele lor.
  2. Dimensiunea în fiecare dimensiune a formei de ieșire este maximul tuturor mărimilor de intrare în acea dimensiune.
  3. O intrare poate fi utilizată în calcul în cazul în care dimensiunea sa într-o anumită dimensiune, fie se potrivește cu dimensiunea de ieșire în acea dimensiune, sau are o valoare exact 1.
  4. Dacă o intrare are o dimensiune de dimensiune 1 , în forma sa, prima intrare de date în această dimensiune va fi utilizată pentru toate calculele de-a lungul acelei dimensiuni. Cu alte cuvinte, mașinile pas cu pas a ufuncvoinței pur și simplu nu pas de-a lungul ca dimensiune (pasului va fi 0 pentru acea dimensiune).

Operația este posibilă (rezultat doesnt în shape mismatcheroare ați menționat) , în trei cazuri:

  1. toate Matricele au exact aceeași formă.
  2. toate Matricele au același număr de dimensiuni și lungimea fiecărei dimensiuni este fie o lungime comună sau 1.
  3. Matricele care au prea puține dimensiuni pot avea forme prefixat cu o dimensiune de lungime 1 pentru a satisface proprietatea 2.

Exemple pot fi găsite prin link de mai sus.

Publicat 20/01/2010 la 19:28
sursa de către utilizator

voturi
2

Lasă-mă să văd dacă am înțeles ...

>>> from numpy import ones, newaxis
>>> A = ones((4,3))   # 4 rows x 3 cols
>>> A.shape
(4, 3)
>>> A
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])
>>> 
>>> ones((4,1))      # 4 rows x 1 col
array([[ 1.],
       [ 1.],
       [ 1.],
       [ 1.]])
>>> A + ones((4,1))
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])
>>> 
>>> ones((1,3))      # 1 row x 3 cols
array([[ 1.,  1.,  1.]])
>>> A + ones((1,3))  
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])
>>> 
>>> B = ones((3,))   # a 1D array
>>> B
array([ 1.,  1.,  1.])
>>> B.shape
(3,)
>>> A + B
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])
>>> 
>>> C = ones((4,))   # a 1D array
>>> C.shape
(4,)
>>> C
array([ 1.,  1.,  1.,  1.])
>>> A + C
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape
>>> 
>>> D = C[:,newaxis]
>>> D.shape
(4, 1)
>>> A + D
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])

Transmisiunea necesare pentru a face 4 x 3 vector plus un vector 1D cu 3 elemente reușește.

Transmisiunea necesare pentru a face 4 x 3 vector plus un vector 1D cu 4 elemente eșuează.

>>> D = C[:,newaxis]

convertește C la un vector 2D a unei forme compatibile.

Publicat 20/01/2010 la 20:43
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more