Tổng mảng 2D phức tạp trong Python qua các chỉ số nhất định

Jan 18 2021

Có một mảng 2-d như thế này:

img = [
  [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
  [[2, 2, 2], [3, 2, 3], [6, 7, 6]],
  [[9, 8, 1], [9, 8, 3], [9, 8, 5]]
]

Và tôi chỉ muốn lấy tổng các chỉ số nhất định như sau:

indices = [[0, 0], [0, 1]] # which means img[0][0] and img[0][1]
# means here is represents

Có một câu hỏi tương tự về mảng 1-d trong stackoverflow trong liên kết này , nhưng nó đã gặp lỗi khi tôi cố gắng sử dụng print(img[indices]). Bởi vì tôi muốn làm rõ rằng phần tử của imglà những phần tử chỉ ra bằng chỉ số, và sau đó lấy nghĩa là tổng của nó.

Sản lượng mong đợi

[5, 7, 9]

Trả lời

2 PabloC Jan 18 2021 at 10:00

Sử dụng NumPy:

import numpy as np

img = np.array(img)
img[tuple(indices)].sum(axis = 0)
#array([5, 7, 9])
1 TấnNguyên Jan 18 2021 at 10:16

Nếu kết quả là [5, 7, 9] thì tổng trên cột của danh sách. Sau đó, dễ dàng:

img = np.asarray(img)
indices = [[0, 0], [0, 1]]
img[(indices)].sum(axis = 0)

Kết quả:

array([5, 7, 9])
1 MadPhysicist Jan 18 2021 at 10:07

Khi bạn cung cấp một chỉ mục ưa thích, mỗi phần tử của bộ chỉ mục đại diện cho một trục khác nhau. Hình dạng của mảng chỉ mục phát sóng theo hình dạng của đầu ra mà bạn nhận được.

Trong trường hợp của bạn, các hàng indices.Tlà chỉ số trong mỗi trục. Bạn có thể chuyển đổi chúng thành một bộ chỉ mục và nối thêm slice(None), tương đương với lập trình :. Bạn có thể lấy giá trị trung bình của mảng 2D kết quả trực tiếp:

img[tuple(indices.T) + (slice(None),)].sum(0)

Một cách khác là sử dụng toán tử splat:

img[(*indices.T, slice(None))].sum(0)