【问题标题】:How to efficiently match two array values in Python?如何有效地匹配 Python 中的两个数组值?
【发布时间】:2019-09-02 00:35:27
【问题描述】:

我正在尝试在 Python 中找到匹配两个数组轴的最佳方法,最有可能使用 Numpy。 更准确地说: 我有C 这是一个 H x W x L 矩阵和 D 这是一个 H x W 矩阵。 H和W是图像的高度和宽度,L例如是可以在图像中显示的亮度的集合(例如0100 )。 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 矩阵有关。

嗯,这就是我目前所尝试的,一如既往地感谢您的帮助!

【问题讨论】:

  • 我认为 np.sum(C[:,:,0] == D) 应该足够了
  • 第三个轴包含 0 和 L-1 之间的值:我想添加这些值,因为它们与 D 中的值匹配(像素到像素)。在这里,我只会添加我认为的,因为它会返回一个布尔矩阵。

标签: python arrays numpy


【解决方案1】:

您为什么不将D 的所有值相加? C中的亮度有没有可能不会出现在D中,这是为什么?

无论如何,实现您想要的另一种方法是重复 C 的值以匹配 D 的形状,然后仅对匹配的值求和,前提是 C 的每个像素没有重复值.

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

【讨论】:

  • 我认为我有点误导并且确实把事情搞混了:除了亮度之外,我还有其他值作为第三轴:矩阵 D 只会让我得到最终会告诉我哪个值的索引求和这个像素。我会编辑我的消息。
  • 我想我明白了。然而,如果您创建一个辅助矩阵,它具有与 C 相同的维度,但索引值作为第三个维度。您可以将它们总结为sum = np.sum(C[C_auxiliary==D_repeated])
  • 您可以通过np.indices 获得此C_auxiliary。这将是z 维度:x, y, z = np.indices((H, W, L))
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 2016-12-02
    • 2020-07-24
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多