NumPy - Lập chỉ mục nâng cao
Có thể thực hiện lựa chọn từ ndarray là một chuỗi không phải tuple, đối tượng ndarray kiểu dữ liệu số nguyên hoặc Boolean, hoặc một bộ dữ liệu có ít nhất một mục là đối tượng chuỗi. Lập chỉ mục nâng cao luôn trả về một bản sao của dữ liệu. Ngược lại, việc cắt chỉ hiển thị một khung nhìn.
Có hai loại lập chỉ mục nâng cao - Integer và Boolean.
Lập chỉ mục số nguyên
Cơ chế này giúp chọn bất kỳ mục tùy ý nào trong một mảng dựa trên chỉ mục Thứ nguyên của nó. Mỗi mảng số nguyên đại diện cho số chỉ mục trong thứ nguyên đó. Khi chỉ mục bao gồm nhiều mảng số nguyên như kích thước của mảng đích, nó sẽ trở nên đơn giản.
Trong ví dụ sau, một phần tử của cột được chỉ định từ mỗi hàng của đối tượng ndarray được chọn. Do đó, chỉ mục hàng chứa tất cả các số hàng và chỉ mục cột chỉ định phần tử được chọn.
ví dụ 1
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print y
Đầu ra của nó sẽ như sau:
[1 4 5]
Vùng chọn bao gồm các phần tử tại (0,0), (1,1) và (2,0) từ mảng đầu tiên.
Trong ví dụ sau, các phần tử được đặt ở các góc của mảng 4X3 được chọn. Các chỉ số hàng được lựa chọn là [0, 0] và [3,3] trong khi các chỉ số cột là [0,2] và [0,2].
Ví dụ 2
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print 'Our array is:'
print x
print '\n'
rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]])
y = x[rows,cols]
print 'The corner elements of this array are:'
print y
Kết quả của chương trình này như sau:
Our array is:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
The corner elements of this array are:
[[ 0 2]
[ 9 11]]
Lựa chọn kết quả là một đối tượng ndarray chứa các phần tử góc.
Lập chỉ mục nâng cao và cơ bản có thể được kết hợp bằng cách sử dụng một lát cắt (:) hoặc dấu chấm lửng (…) với một mảng chỉ mục. Ví dụ sau sử dụng lát cắt cho hàng và chỉ mục nâng cao cho cột. Kết quả là như nhau khi lát cắt được sử dụng cho cả hai. Nhưng chỉ mục nâng cao dẫn đến bản sao và có thể có bố cục bộ nhớ khác nhau.
Ví dụ 3
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print 'Our array is:'
print x
print '\n'
# slicing
z = x[1:4,1:3]
print 'After slicing, our array becomes:'
print z
print '\n'
# using advanced index for column
y = x[1:4,[1,2]]
print 'Slicing using advanced index for column:'
print y
Đầu ra của chương trình này sẽ như sau:
Our array is:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
After slicing, our array becomes:
[[ 4 5]
[ 7 8]
[10 11]]
Slicing using advanced index for column:
[[ 4 5]
[ 7 8]
[10 11]]
Lập chỉ mục mảng Boolean
Loại lập chỉ mục nâng cao này được sử dụng khi đối tượng kết quả có nghĩa là kết quả của các phép toán Boolean, chẳng hạn như toán tử so sánh.
ví dụ 1
Trong ví dụ này, các mục lớn hơn 5 được trả về do lập chỉ mục Boolean.
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print 'Our array is:'
print x
print '\n'
# Now we will print the items greater than 5
print 'The items greater than 5 are:'
print x[x > 5]
Đầu ra của chương trình này sẽ là:
Our array is:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
The items greater than 5 are:
[ 6 7 8 9 10 11]
Ví dụ 2
Trong ví dụ này, các phần tử NaN (Không phải là Số) được bỏ qua bằng cách sử dụng ~ (toán tử bổ sung).
import numpy as np
a = np.array([np.nan, 1,2,np.nan,3,4,5])
print a[~np.isnan(a)]
Đầu ra của nó sẽ là -
[ 1. 2. 3. 4. 5.]
Ví dụ 3
Ví dụ sau đây cho thấy cách lọc ra các phần tử không phức tạp khỏi một mảng.
import numpy as np
a = np.array([1, 2+6j, 5, 3.5+5j])
print a[np.iscomplex(a)]
Ở đây, kết quả như sau:
[2.0+6.j 3.5+5.j]