Perbedaan antara: dan, di numpy

Oct 04 2020

Beberapa sumber telah menyebutkan bahwa dalam numpymengiris array, array[2,:,1]hasilnya sama seperti array[2][:][1], tetapi saya tidak mendapatkan yang sama dalam kasus ini:

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

dan:

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

Apa bedanya?

Jawaban

3 hpaulj Oct 04 2020 at 15:54

beberapa sumber salah!

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

Ketika indeks semuanya skalar, jenis dekomposisi ini berfungsi:

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

Satu indeks mengurangi dimensi, memilih satu 'bidang':

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

[:]yang tidak berarti apa-apa - ini bukan placeholder dengan sendirinya. Dalam indeks multidimensi itu adalah sepotong - semuanya dalam dimensi itu. Kami melihat perilaku yang sama dengan daftar. alist[2]mengembalikan elemen, alist[:]mengembalikan salinan dari seluruh daftar.

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

Ingat, numpyadalah paket python. Sintaks Python masih berlaku di semua level. x[a][b][c]melakukan 3 operasi pengindeksan secara berurutan, 'merangkai' mereka. x[a,b,c]adalah salah satu operasi pengindeksan, meneruskan tupel ke x. Itu kode numpy yang menafsirkan tupel itu.

Kami harus menggunakan indeks multidimensi pada dimensi yang tersisa:

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

Penerjemah sebenarnya melakukan:

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