Cắt các mảng với danh sách


8

Vì vậy, tôi tạo ra một mảng numpy:

a = np.arange(25).reshape(5,5)

mảng ([[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]])

Một lát cắt thông thường a[1:3,1:3]trả về

mảng ([[6, 7], [11, 12]])

cũng như sử dụng một danh sách trong thứ hai a[1:3,[1,2]]

mảng ([[6, 7], [11, 12]])

Tuy nhiên, a[[1,2],[1,2]]lợi nhuận

mảng ([6, 12])

Rõ ràng tôi không hiểu điều gì ở đây. Điều đó nói rằng, cắt lát với một danh sách có thể rất hữu ích.

Chúc mừng

keng


a[[1,2],[1,2]]nghĩa vụ phải nói a[[1:2],[1:2]]? Có một lỗi đánh máy trong a[1:3,[1,2]]? Hay tôi đang hiểu lầm?
SherylHohman

Câu trả lời:


2

Bạn đã quan sát thấy hiệu quả của cái gọi là Lập chỉ mục nâng cao . Hãy xem xét ví dụ từ liên kết:

import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
print(x)
[[1 2]
 [3 4]
 [5 6]]
print(x[[0, 1, 2], [0, 1, 0]])  # [1 4 5]

Bạn có thể nghĩ về điều này khi cung cấp danh sách tọa độ (Cartesian) của lưới, như

print(x[0,1])  # 1
print(x[1,1])  # 4
print(x[2,0])  # 5

0

Trong trường hợp cuối cùng, hai danh sách riêng lẻ được coi là các hoạt động lập chỉ mục riêng biệt (đây là từ ngữ thực sự khó xử vì vậy xin vui lòng chịu đựng với tôi).

Numpy thấy hai danh sách hai số nguyên và quyết định rằng bạn đang yêu cầu hai giá trị. Chỉ mục hàng của mỗi giá trị đến từ danh sách đầu tiên, trong khi chỉ mục cột của mỗi giá trị đến từ danh sách thứ hai. Do đó, bạn có được a[1,1]a[2,2]. Các :ký hiệu không chỉ mở rộng vào danh sách bạn đã suy luận một cách chính xác, nhưng cũng nói với NumPy mà bạn muốn tất cả các hàng / cột trong phạm vi đó.

Nếu bạn cung cấp các chỉ mục danh sách được quản lý theo cách thủ công, chúng phải có cùng kích thước, bởi vì kích thước của mỗi / bất kỳ danh sách nào là số phần tử bạn sẽ nhận được. Ví dụ: nếu bạn muốn các phần tử trong cột 1 và 2 của hàng 1,2,3:

>>> a[1:4,[1,2]]
array([[ 6,  7],
       [11, 12],
       [16, 17]])

Nhưng

>>> a[[1,2,3],[1,2]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,)

Các cựu nói với NumPy rằng bạn muốn có một loạt các hàng và cột cụ thể, trong khi sau này nói "làm cho tôi các yếu tố tại (1,1), (2,2)(3, hey! what the?! where's the other index?)"


0

a[[1,2],[1,2]]đang đọc cái này vì tôi muốn [1,1] và [2,2]. Có một vài cách xung quanh điều này và tôi có thể thậm chí không có cách tốt nhất nhưng bạn có thể thử

a[[1,1,2,2],[1,2,1,2]]

Điều này sẽ cung cấp cho bạn một phiên bản phẳng ở trên

a[[1,2]][:,[1,2]]

Điều này sẽ cung cấp cho bạn lát chính xác, nó hoạt động bằng cách lấy các hàng [1,2] và sau đó là cột [1,2].


0

Nó kích hoạt lập chỉ mục nâng cao nên lát đầu tiên là chỉ mục hàng, thứ hai là chỉ mục cột. Đối với mỗi hàng, nó chọn cột tương ứng.

a[[1,2], [1,2]] -> [a[1, 1], a[2, 2]] -> [6, 12]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.