Цифровая нотация для замены перечислимого (zip (....)) - PullRequest
0 голосов
/ 10 ноября 2018

Я начинаю использовать NumPy. Я получаю обозначения срезов и поэлементные вычисления, но я не могу обернуться вокруг этого:

for i, (I,J) in enumerate(zip(data_list[0], data_list[1])):
    joint_hist[int(np.floor(I/self.bin_size))][int(np.floor(J/self.bin_size))] += 1

Переменные:

data_list содержит 2 np.array().flatten() изображений (возможно, больше)

joint_hist[] отображается позже с plt.imshow() и является объединенной гистограммой этих 2 изображений

bin_size - количество слотов в гистограмме

Что я не могу обернуть вокруг себя, так это тот факт, что координата в последней гистограмме - это я, J. Так что дело не только в том, что значение в позиции в joint_hist [] является результатом некоторого вычисления срезов / элементов. Мне нужно взять результат этого вычисления и использовать ТО в качестве индексов в joint_hist ...

РЕДАКТИРОВАТЬ:

Я действительно не использую i в цикле - это пережиток предыдущих итераций, и я просто не заметил, что он мне больше не нужен

Я действительно хочу контролировать размеры бинов и детали того, как это делается, поэтому не особо хочу использовать гистограмму2D. Позже я буду использовать это для дальнейшей обработки изображений, поэтому я предпочел бы иметь гибкость, чтобы адаптировать свой подход, чем выяснять, если / как делать определенные вещи со встроенными функциями.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Если я понимаю, ваша цель состоит в том, чтобы сделать гистограмму или коррелированные значения в ваших изображениях? Ну, чтобы получить правильный индекс бина, вычисление, которое вы использовали, недопустимо. Вместо np.floor (I / self.bin_size) используйте np.floor (I / (I_max / bin_size)). Astype (int). Вы хотите разделить I и J их соответствующим разрешением. В результате вы получите диагональную матрицу для joint_hist, если data_list [0] и data_list [1] - это одно и то же сплющенное изображение.

Итак, все вместе:

I_max = data_list[0].max()+1
J_max = data_list[1].max()+1
joint_hist = np.zeros((I_max, J_max))
bin_size = 256
for i, (I, J) in enumerate(zip(data_list[0], data_list[1])):
    joint_hist[np.floor(I / (I_max / bin_size)).astype(int), np.floor(J / (J_max / bin_size)).astype(int)] += 1
0 голосов
/ 10 ноября 2018

Вы действительно можете замять этот цикл 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 будет определять их автоматически).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...