gpt4 book ai didi

python - 提取二维二进制数组的索引

转载 作者:太空宇宙 更新时间:2023-11-04 01:04:47 31 4
gpt4 key购买 nike

我有一个由 0 和 1 组成的 numpy 数组(数据)。

import numpy as np

data = np.array([[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0],
[1, 1, **1**, 1, 1, 0],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0],
[1, 1, 1, 1, 1, 1]])

我想提取“1”周围由 1 组成的相邻 5*5 元素的索引。

预期索引用星号表示,即 (3,3)。 bool 数组形式的答案也可以。

[[False False False False False False]
[False False False False False False]
[False False **True** False False False]
[False False False False False False]
[False False False False False False]
[False False False False False False]]

我试过

from scipy.ndimage.morphology import binary_erosion


kernel = np.ones((5,5))

result = binary_erosion(data, kernel)
print result

[[False False False False False False]
[False False False False False False]
[False False True False False False]
[False False True False False False]
[False False False False False False]
[False False False False False False]]

它产生了两个“真实”位置,但我只想要一个位于 (3,3)。

怎么做?

编辑:链接问题中显示的解决方案也给出了意想不到的答案。

最佳答案

除了 binary_erosion,您可以使用 scipy.ndimage.generic_filter 来实现这一点,

from scipy.ndimage import generic_filter
generic_filter(data, np.all, size=(5,5), mode='constant', cval=0).astype(np.bool)

但是你会得到和上面一样的结果,

array([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0],
[0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]]) # using 1, 0 instead of True, False for readability

因为它是您问题的正确答案。示例矩阵中的 6 行是对称的,对于给定的内核,结果中将有 2 个对称的 True 元素。

如果您想避免这种情况,您可以使用非对称内核大小:size=(6,5),尽管这会在第 3 行而不是第 2 行中生成一个真元素。这可能被修复,在使用 binary_erosion 时手动用零填充 kernel 数组。

关于python - 提取二维二进制数组的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30964409/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com