Menu
CoddyTech

Lập chỉ mục theo chiều

Bài học 13 trên 18 trong khóa học Nền tảng NumPy của Coddy.

Numpy hỗ trợ một công cụ cực kỳ mạnh mẽ: lập chỉ mục các chiều.

Để lập chỉ mục một chiều, ta dùng dấu hai chấm :. Dấu hai chấm lấy tất cả phần tử tại chỉ số cụ thể mà nó được đặt vào. Ví dụ, giả sử ta có một mảng có hình dạng ary.shape # --> (2, 1, 3, 1), đặt dấu hai chấm : tại ary[:, 0, 0, 0] sẽ lấy hai phần tử ngoài cùng bên trái của hình dạng, rồi với mỗi phần tử, nó sẽ lấy phần tử có chỉ số 0 ở các chiều còn lại.

Lưu ý: Vị trí của dấu hai chấm trong brackets [] là chiều mà ta đang lập chỉ mục, nghĩa là

  • ary[:, 0, 0, 0] Lập chỉ mục chiều 4D
  • ary[0, :, 0, 0] Lập chỉ mục chiều 3D
  • ary[0, 0, :, 0] Lập chỉ mục chiều 2D
  • ary[0, 0, 0, :] Lập chỉ mục chiều 1D
  • ary[:, :, 0, 0] Lập chỉ mục các chiều 4D và 3D
  • vân vân

Ví dụ 1

ary = np.array([
	[1, 2], 
	[3, 4]
])
ary[:, 0] # --> [1, 3]
ary[0, :] # --> [1, 2]

Dấu hai chấm lấy tất cả phần tử tại chỉ số đã chỉ định rồi tiếp tục đến chỉ số tiếp theo

Trong trường hợp này: 

  • ary[:, 0] Ta lấy tất cả phần tử đầu tiên, rồi tại mỗi phần tử ta lấy phần tử chỉ số 0
  • ary[0, :] Ta lấy phần tử đầu tiên, rồi tại phần tử đó ta lấy tất cả phần tử.

Ví dụ 2

Mảng 3D

ary = np.array([
	[[1, 2], [3, 4]],
	[[5, 6], [7, 8]]
])
ary[:, 0, :] # --> [[1, 2], [5, 6]]
ary[:, :, 0] # --> [[1, 3], [5, 7]]
  • ary[:, 0, :] Ta lấy tất cả phần tử, sau đó lấy phần tử đầu tiên, cuối cùng lấy tất cả phần tử ở đó
  • ary[:, :, 0] Ta lấy tất cả phần tử, sau đó lấy tất cả các phần tử này, cuối cùng lấy phần tử đầu tiên ở mỗi phần tử.
  • Bạn đoán được đầu ra của ary[0, :, :] không?

Ví dụ 3

Lấy chỉ số đầu tiên và cuối cùng của mỗi hàng

x = np.array([
	[ 0,  1,  2,  3,  4,  5],
	[ 6,  7,  8,  9, 10, 11],
	[12, 13, 14, 15, 16, 17],
	[18, 19, 20, 21, 22, 23],
])
x[:, np.array([0, -1])]
>>> [0, 5, 6, 11, 12, 17, 18, 23]

Ví dụ 4

Một mảng có hình dạng (2, 1, 3, 1), giống như ví dụ mở đầu

ary = np.array([
    [
        [
            [1],[2],[3]
        ]
    ],
    [
        [
            [4],[5],[6]
        ]
    ]
])
ary[:, 0, 0, 0] # --> [1, 4]
ary[0, :, 0, 0] # --> [1]
ary[0, 0, :, 0] # --> [1, 2, 3]
ary[0, 0, 0, :] # --> [1]

Lưu ý: Bạn cũng có thể dùng cú pháp cắt lát start:stop:step mà ta đã học trong bài học Slicing

  • ary[:, 0:5, 2:3, :]
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

challenge icon

Thử thách

Dễ

Với mảng 3D ary, hãy lấy số thứ 2, thứ 3 và thứ 4 từ mỗi mảng 1D.

Tự làm thử

import numpy as np
'''
ary looks like:
array([[[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]],

       [[20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]],

       [[40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
        [50, 51, 52, 53, 54, 55, 56, 57, 58, 59]],

       [[60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
        [70, 71, 72, 73, 74, 75, 76, 77, 78, 79]],

       [[80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
        [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]]])
'''
ary = np.arange(0, 100).reshape(5, 2, 10) # don't change ary
res = ary[] # <-- Complete indices
print(str(res).replace("\n", "")) # don't change this line

Tất cả bài học trong Nền tảng NumPy

Tự luyện tập: Trình biên dịch Python online