Sự khác biệt giữa: và, trong numpy

Oct 04 2020

Một số tài nguyên đã đề cập rằng trong cách numpycắt mảng của, array[2,:,1]kết quả giống như array[2][:][1], nhưng tôi không nhận được những kết quả tương tự trong trường hợp này:

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

và:

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

Sự khác biệt là gì?

Trả lời

3 hpaulj Oct 04 2020 at 15:54

một số tài nguyên là sai!

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

Khi tất cả các chỉ số đều vô hướng, kiểu phân hủy này hoạt động:

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

Một chỉ mục làm giảm thứ nguyên, chọn một 'mặt phẳng':

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

[:]trên đó không làm gì cả - bản thân nó không phải là một người giữ chỗ. Trong chỉ mục đa chiều, nó là một lát cắt - toàn bộ sự vật trong không gian đó. Chúng tôi thấy hành vi tương tự với các danh sách. alist[2]trả về một phần tử, alist[:]trả về một bản sao của toàn bộ danh sách.

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

Hãy nhớ rằng, numpylà một gói python. Cú pháp Python vẫn được áp dụng ở tất cả các cấp. x[a][b][c]thực hiện 3 thao tác lập chỉ mục theo trình tự, 'xâu chuỗi' chúng. x[a,b,c]là một hoạt động lập chỉ mục, chuyển một bộ giá trị tới x. Đó là mã numpy diễn giải tuple đó.

Chúng ta phải sử dụng chỉ mục đa chiều trên các thứ nguyên còn lại:

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

Thông dịch viên thực sự làm:

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