Как эффективно сопоставить два значения массива в Python? - PullRequest
2 голосов
/ 11 апреля 2019

Я пытаюсь найти лучший способ сопоставления двух осей массива в Python, скорее всего, с использованием Numpy.Чтобы быть более точным: у меня есть C, который является матрицей H x W x L, и D, который является матрицей H x W.H и W - это высота и ширина изображения, а L - это, например, набор яркости, который может отображаться на изображении (например, от 0 до 100 ).D содержит реальную яркость пикселя.

Я хочу добавить все значения, связанные с яркостью, на третьей оси C пикселей, которые соответствуют яркости в D матрица, например, значение в матрице D скажет мне, какой индекс использовать для получения значения в матрице C.

Конечно, я могу легко сделать это с помощью трех циклов:

sum = 0

for row in range(H) :
  for column in range(W) :
    for luminance in range(L) :
      if luminance == D[row, column] :
        sum += C[row, column, luminance]
        break

Но это неэффективно.Я пытаюсь найти способ сделать это, используя numpy, что-то вроде этого:

import numpy as np

sum = np.sum(C[:, :, np.where(C[:,:] == [D[:,:]])[0][0]))

Я не знаю, должно ли это работать.Я думаю, что может быть способ использовать функцию meshgrid , чтобы легко проходить по пикселям и правильно сопоставлять, вызывая

import numpy as np

sum = np.sum(np.meshgrid(range(H), range(W), f(D)))

где f (D) должно быть что-то, что связано с матрицей D .

Ну, это то, что я пробовал до сих пор, спасибо за вашу помощь, как всегда!

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

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

Можно было бы сделать это с:

import numpy as np

lines, columns = np.meshgrid(range(H), range(W), indexing='ij')

sum = np.sum(C[lines, columns, D])

При этом значение в D указывает, какой индекс использовать в C, чтобы получить правильное значение.

0 голосов
/ 11 апреля 2019

Почему бы вам просто не сложить все значения D?Есть ли вероятность того, что яркость в C не появится в D, вот почему?

В любом случае, еще один способ добиться желаемого - повторить значения C, чтобы соответствоватьформа D, а затем суммируются только совпадающие значения, при условии, что каждый пиксель C не имеет повторяющихся значений.

D_repeated = np.repeat(D[:, :, np.newaxis], L, axis=2)
sum = np.sum(C[C==D_repeated])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...