如何在Python中有效地匹配两个数组值?

时间:2019-04-11 11:26:06

标签: python arrays numpy

我试图找到在Python中匹配两个数组轴的最佳方法,最有可能使用Numpy。 更准确地说: 我有C是H xW x L矩阵,还有D是H xW矩阵。 H和W是图像的高度和宽度,L是例如可以在图像中显示的亮度集(例如 0 100 )。 D包含像素的实际亮度。

我想添加所有与 D 矩阵中的亮度相匹配的像素的C的第三轴上与亮度相关的所有值。 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 :(得分:0)

为什么不只对D的所有值求和? C中的亮度有可能不会出现在D中,这是为什么吗?

无论如何,另一种实现所需功能的方法是重复C的值以匹配D的形状,然后仅对匹配的值求和,前提是C的每个像素均不没有重复的值。

D_repeated = np.repeat(D[:, :, np.newaxis], L, axis=2)
sum = np.sum(C[C==D_repeated])

答案 1 :(得分:0)

我正在用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中使用哪个索引来获取正确的值。