Python 2 boyutlu dizi belirli endekslerin toplamı

Jan 18 2021

Bunun gibi 2 boyutlu bir dizi var:

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

Ve sadece şuna benzer bazı endekslerin toplamını elde etmek istiyorum:

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

Bu bağlantıda stackoverflow'da 1-d dizisi hakkında benzer bir soru vardı , ancak kullanmaya çalıştığımda hata aldı print(img[indices]). Çünkü, öğesinin imgindekslerle gösterilenler olduğunu açıklığa kavuşturmak ve ardından anlamına gelmek toplamı.

Beklenen çıktı

[5, 7, 9]

Yanıtlar

2 PabloC Jan 18 2021 at 10:00

NumPy'yi kullanın:

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

Sonuç, listenin sütununun toplamı olan [5, 7, 9] olursa. O zaman kolay:

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

Sonuç:

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

Süslü bir dizin sağladığınızda, dizin dizisinin her bir öğesi farklı bir ekseni temsil eder. İndeks dizilerinin şekli, aldığınız çıktının şekline göre yayın yapar.

Sizin durumunuzda, satırları indices.Ther eksendeki endekslerdir. Bunları bir dizin demetine dönüştürebilir slice(None)ve programatik eşdeğeri olan ekleme yapabilirsiniz :. Ortaya çıkan 2D dizinin ortalamasını doğrudan alabilirsiniz:

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

Başka bir yol da uyarıcı operatörünü kullanmaktır:

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