2017-11-25 3 views
2

Ich erwäge eine numpy Array:Verschiedene Formen für die ‚gleichen‘ Teile ndarray

import numpy as np 
b = np.empty((10,11,12)) 

Jetzt würde ich die folgenden Formen erwartet das gleiche sein, aber sie sind offensichtlich nicht:

>>> b[0,:,1].shape 
>>> (11,) 

und

>>> b[0][:][1].shape 
>>> (12,) 

Kann jemand mir erklären, warum die Formen unterschiedlich sind? Ich lese die Numpy Dokumentation über die Indizierung, aber dort steht, dass Schreiben a[k][l] ist das gleiche wie a[k,l].

+0

Aber das gilt nicht für '[:]' oder Ausdrücke mit ':'. – hpaulj

+0

In der zweiten wird 'temp = b [0]' ausgewertet. Dann 'temp1 = temp [:]', dann 'temp1 [1]'. Das heißt, separate Indizierungsoperationen. 'b [0,:, 1]' ist eine Indexierungsoperation, die als Ganzes mit "numpy" ausgewertet wird. Es ist nicht immer sinnvoll, die beiden Operationen zu versuchen. – hpaulj

Antwort

4

Dies passiert, weil b[0][:] ist eine Ansicht von b[0], so dass b[0][:][1] wirklich b[0, 1, :] ist. Ein numerisches Beispiel kann dabei helfen, die Vorgänge hervorzuheben:

In [5]: b = np.arange(3*4*5).reshape((3, 4, 5)) 

In [6]: b[0] 
Out[6]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]) 

In [7]: b[0, :] 
Out[7]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]) 

In [8]: b[0, :, 1] 
Out[8]: array([ 1, 6, 11, 16]) 

In [10]: b[0][:] 
Out[10]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]) 

In [11]: b[0][:][1] 
Out[11]: array([5, 6, 7, 8, 9]) 

In [13]: b[0, 1, :] 
Out[13]: array([5, 6, 7, 8, 9]) 

In [32]: b[0][:, 1] 
Out[32]: array([ 1, 6, 11, 16]) 
+0

Ich denke, ich verstehe es jetzt. [:] gibt eine Kopie des Arrays, verwendet sie aber auf diese Weise: b [0,:, 1] bedeutet, dass Sie in der ersten Dimension die 0. Position wählen, die gesamte zweite Dimension und die erste Position in der dritten Dimension. Recht? – user9007131

+0

Bis auf einen gemeinsamen Fehler: Im Gegensatz zu dem, was bei einer Python-'list' passiert,' '' '' * * * seicht nicht 'np.darray'; Stattdessen erhalten Sie eine Ansicht des ursprünglichen Arrays: Wenn Sie 'c = b [:]' lassen und einen Teil von 'c' ändern, ändert sich auch der Inhalt, auf den sich' b' bezieht. – fuglede

+0

Was wird [:] überhaupt für den Umgang mit numpigen Arrays verwendet? Ich könnte es einfach weglassen und in den obigen Beispielen immer das gleiche Ergebnis erhalten. – user9007131

Verwandte Themen