Python numpy อาร์เรย์ 2D รวมกับดัชนีบางอย่าง

Jan 18 2021

มีอาร์เรย์ 2 มิติดังนี้:

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]]
]

และฉันแค่อยากได้ผลรวมของดัชนีที่เป็นดังนี้:

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

มีความคล้ายกันถามเกี่ยวกับ 1-D อาร์เรย์ใน StackOverflow ในการเชื่อมโยงนี้print(img[indices])แต่มันก็มีข้อผิดพลาดเมื่อฉันพยายามที่จะใช้ เพราะฉันต้องการทำให้ชัดเจนว่าองค์ประกอบของimgคือสิ่งที่บ่งชี้ด้วยดัชนีแล้วจึงได้รับ ค่าเฉลี่ย ผลรวมของมัน

ผลลัพธ์ที่คาดหวัง

[5, 7, 9]

คำตอบ

2 PabloC Jan 18 2021 at 10:00

ใช้ 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

หากผลลัพธ์เป็น [5, 7, 9] ซึ่งเป็นผลรวมของคอลัมน์ของรายการ จากนั้นง่าย:

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

ผลลัพธ์:

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

เมื่อคุณจัดหาดัชนีแฟนซีแต่ละองค์ประกอบของดัชนีทูเพิลจะแสดงแกนที่แตกต่างกัน รูปร่างของดัชนีอาร์เรย์กระจายไปยังรูปร่างของเอาต์พุตที่คุณได้รับ

ในกรณีของคุณแถวของindices.Tคือดัชนีในแต่ละแกน คุณสามารถแปลงเป็นดัชนีทูเพิลและต่อท้ายslice(None)ซึ่งเทียบเท่าแบบเป็นโปรแกรมของ:. คุณสามารถหาค่าเฉลี่ยของอาร์เรย์ 2D ที่เป็นผลลัพธ์ได้โดยตรง:

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

อีกวิธีหนึ่งคือการใช้ตัวดำเนินการ Splat:

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