Вы действительно можете замять этот цикл for
, используя некоторую нотацию. Предполагая, что вам на самом деле не нужен i
(поскольку он нигде не используется):
for I,J in (data_list.T // self.bin_size).astype(int):
joint_hist[I, J] += 1
Объяснение
data_list.T
переворачивает data_list
на бок. Каждая строка data_list.T
будет содержать данные для пикселей с определенной координатой.
data_list.T // self.bin_size
даст тот же результат, что и np.floor(I/self.bin_size)
, только он будет работать со всеми пикселями одновременно, а не по одному за раз.
.astype(int)
делает то же самое, что и int(...)
, но снова работает со всем массивом вместо одного элемента.
Когда вы перебираете двумерный массив с циклом for
, строки возвращаются по одной за раз. Таким образом, синтаксис for I,J in arr
вернет вам по одной паре пикселей за раз, точно так же, как изначально делал ваш оператор zip
.
Альтернативные
Вы также можете просто использовать histogramdd
для вычисления joint_hist
вместо вашего for
цикла. Для вашего приложения это будет выглядеть так:
import numpy as np
joint_hist,edges = np.histogramdd(data_list.T)
Это будет иметь другие корзины, чем те, которые вы указали выше, хотя (Numpy будет определять их автоматически).