Arasındaki fark: ve, numpy

Oct 04 2020

Bazı kaynaklar numpydizi dilimlemenin array[2,:,1]sonuçlarının aynı olduğunu belirtmişlerdir array[2][:][1], ancak bu durumda aynı olanları elde edemiyorum:

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

ve:

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

Fark ne?

Yanıtlar

3 hpaulj Oct 04 2020 at 15:54

bazı kaynaklar yanlış!

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

Endekslerin tümü skaler olduğunda, bu tür bir ayrıştırma işe yarar:

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

Bir indeks, bir 'düzlem' seçerek boyutu küçültür:

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

[:]bu hiçbir şey yapmaz - kendi başına bir yer tutucu değildir. Çok boyutlu indeks içinde bir dilimdir - bu boyuttaki her şey. Listelerde de aynı davranışı görüyoruz. alist[2]bir öğe alist[:]döndürür, tüm listenin bir kopyasını döndürür.

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

Unutmayın, numpybir python paketidir. Python sözdizimi hala tüm düzeylerde geçerlidir. x[a][b][c]sırayla 3 indeksleme işlemi yapar, bunları 'zincirleme'. x[a,b,c]bir demetini to'ya geçiren bir dizinleme işlemidir x. Bu demeti yorumlayan uyuşmuş kod.

Kalan boyutlar için çok boyutlu bir indeks kullanmalıyız:

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

Tercüman aslında şunları yapar:

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