Różnica między: i, w numpy

Oct 04 2020

Niektóre zasoby wspomniały, że numpywycinanie tablic array[2,:,1]daje takie same wyniki, jak array[2][:][1], ale w tym przypadku nie otrzymuję takich samych:

array3d = np.array([[[1, 2], [3, 4]],[[5, 6], [7, 8]], [[9, 10], [11, 12]]])
array3d[2,:,1]
out: array([10, 12])

i:

array3d[2][:][1]
out: array([11, 12])

Jaka jest różnica?

Odpowiedzi

3 hpaulj Oct 04 2020 at 15:54

niektóre zasoby są złe!

In [1]: array3d = np.array([[[1, 2], [3, 4]],[[5, 6], [7, 8]], [[9, 10], [11, 12
   ...: ]]])
In [2]: array3d
Out[2]: 
array([[[ 1,  2],
        [ 3,  4]],

       [[ 5,  6],
        [ 7,  8]],

       [[ 9, 10],
        [11, 12]]])

Gdy wszystkie indeksy są skalarne, taki rozkład działa:

In [3]: array3d[2,0,1]
Out[3]: 10
In [4]: array3d[2][0][1]
Out[4]: 10

Jeden indeks zmniejsza wymiar, wybierając jedną „płaszczyznę”:

In [5]: array3d[2]
Out[5]: 
array([[ 9, 10],
       [11, 12]])

[:]na tym nic nie robi - nie jest sam w sobie miejscem na miejsce. W ramach wielowymiarowego indeksu jest to kawałek - całość w tym wymiarze. To samo zachowanie widzimy w przypadku list. alist[2]zwraca element, alist[:]zwraca kopię całej listy.

In [6]: array3d[2][:]
Out[6]: 
array([[ 9, 10],
       [11, 12]])

Pamiętaj, numpyto pakiet Pythona. Składnia Pythona nadal obowiązuje na wszystkich poziomach. x[a][b][c]wykonuje kolejno 3 operacje indeksowania, „łącząc” je. x[a,b,c]to jedna operacja indeksowania, przekazująca krotkę do x. To numpy kod, który interpretuje tę krotkę.

Musimy zastosować wielowymiarowy indeks dla pozostałych wymiarów:

In [7]: array3d[2][:,1]
Out[7]: array([10, 12])
In [8]: array3d[2,:,1]
Out[8]: array([10, 12])

Tłumacz faktycznie:

In [9]: array3d.__getitem__((2,slice(None),1))
Out[9]: array([10, 12])

In [11]: array3d.__getitem__(2).__getitem__((slice(None),1))
Out[11]: array([10, 12])