Tôi muốn cắt một mảng nxn NumPy. Tôi muốn trích xuất một lựa chọn tùy ý gồm m hàng và cột của mảng đó (nghĩa là không có bất kỳ mẫu nào trong số hàng / cột), biến nó thành một mảng mxm mới. Trong ví dụ này, chúng ta hãy nói rằng mảng là 4 x 4 và tôi muốn trích xuất một mảng 2x2 từ nó.
Đây là mảng của chúng tôi:
from numpy import *
x = range(16)
x = reshape(x,(4,4))
print x
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
Các dòng và cột để loại bỏ là như nhau. Trường hợp dễ nhất là khi tôi muốn trích xuất một hàm con 2x2 ở đầu hoặc cuối, tức là:
In [33]: x[0:2,0:2]
Out[33]:
array([[0, 1],
[4, 5]])
In [34]: x[2:,2:]
Out[34]:
array([[10, 11],
[14, 15]])
Nhưng nếu tôi cần loại bỏ một hỗn hợp hàng / cột khác thì sao? Điều gì sẽ xảy ra nếu tôi cần loại bỏ các dòng / hàng đầu tiên và thứ ba, do đó trích xuất hàm con [[5,7],[13,15]]
? Có thể có bất kỳ thành phần của hàng / dòng. Tôi đã đọc ở đâu đó rằng tôi chỉ cần lập chỉ mục cho mảng của mình bằng cách sử dụng mảng / danh sách các chỉ mục cho cả hàng và cột, nhưng điều đó dường như không hoạt động:
In [35]: x[[1,3],[1,3]]
Out[35]: array([ 5, 15])
Tôi tìm thấy một cách, đó là:
In [61]: x[[1,3]][:,[1,3]]
Out[61]:
array([[ 5, 7],
[13, 15]])
Vấn đề đầu tiên với điều này là nó khó đọc, mặc dù tôi có thể sống với điều đó. Nếu ai đó có giải pháp tốt hơn, tôi chắc chắn muốn nghe.
Một điều khác là tôi đọc trên một diễn đàn rằng lập chỉ mục các mảng với các mảng buộc NumPy tạo một bản sao của mảng mong muốn, do đó khi xử lý các mảng lớn, điều này có thể trở thành một vấn đề. Tại sao lại như vậy / cơ chế này hoạt động như thế nào?