【问题标题】:Counting overlapping values of two 2D binary numpy arrays for a specific value为特定值计算两个 2D 二进制 numpy 数组的重叠值
【发布时间】:2016-09-16 17:50:42
【问题描述】:

我从两个相同大小的图像开始。我将它们转换为二进制黑色/白色 numpy 数组(0 = 黑色 1 = 白色)。我想知道有多少黑色像素重叠(两个数组中相同位置的 0 值)。

我知道如何使用 for 循环执行此操作,但我正在尝试学习如何正确使用 numpy,并且我想有更好的方法来执行此操作。

一个最小的例子如下:

数组A:

[ 1 1 0 ]
[ 1 0 0 ]
[ 0 1 1 ]

数组B:

[ 1 0 0 ]
[ 1 1 0 ]
[ 0 1 1 ]

我想知道两个数组在同一位置有多少次“0”值。

在这种情况下,第 1 行第 3 列一次,第 2 行第 3 列一次,第 3 行第 1 列一次。 “0”值的总重叠:3。

我在想一些类似的东西

np.where(arrayA == 0 and arrayB == 0)

但这不起作用。

【问题讨论】:

  • 您能否在您的问题中添加一个最小且可验证的示例?
  • 你尝试了什么?你检查过 numpy 文档吗?我想它可以是一些像这样的布尔运算:docs.scipy.org/doc/numpy/reference/…。类似invert(bitwise_and(x1, x2))
  • @Kasramvd 当然。将其添加到原始问题中。
  • 如果您正在计数,您可以使用np.count_nonzero 有效地计算在接受的解决方案中创建的掩码。这将比使用.sum() 快得多。这是我最近对其进行的运行时测试 - stackoverflow.com/a/38687313/3293881
  • @Divakar 感谢您提供的额外信息!

标签: python arrays numpy multidimensional-array


【解决方案1】:

您可以使用逻辑与进行简单比较:

>>> A
array([[1, 1, 0],
       [1, 0, 0],
       [0, 1, 1]])
>>> B
array([[1, 0, 0],
       [1, 1, 0],
       [0, 1, 1]])
>>> np.logical_and(A == 0, B == 0)
array([[False, False,  True],
       [False, False,  True],
       [ True, False, False]], dtype=bool)

并使用np.where()column_stack() 来获取预期项目的索引:

>>> np.column_stack(np.where(np.logical_and(A == 0, B == 0)))
array([[0, 2],
       [1, 2],
       [2, 0]])

或者作为评论中建议的漂亮 Numpythonic 方式使用 np.argwhere:

>>> np.argwhere(np.logical_and(A == 0, B == 0))
array([[0, 2],
       [1, 2],
       [2, 0]])

【讨论】:

  • 完美,这正是我不知道 / 缺少的功能。谢谢!
  • 或者只是np.argwhere() 我想替换堆叠和np.where
  • @Divakar 确实如此!
【解决方案2】:

郑重声明,您最初的尝试只是缺少正确的运算符和一些括号:

np.where( (arrayA==0) & (arrayB==0))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2020-12-09
    • 2016-11-20
    • 2019-07-14
    相关资源
    最近更新 更多