gpt4 book ai didi

python - Numpy:查找非零值的出现,按索引分组

转载 作者:行者123 更新时间:2023-11-30 22:58:36 27 4
gpt4 key购买 nike

我有一个 3D 数组的集合,每个数组代表一个图像。我想查找给定坐标在所有数组中包含非黑色像素的出现次数。

result = np.zeros_like(list_of_arrays[0])
for array in list_of_arrays:
for (y, x) in np.argwhere(array.any(-1)):
result[y][x] += 1
return result

我怎样才能最好地改进这个简单的实现?如果我知道如何将第三维转换为 0 或 1,我可以复制每个数组,然后将它们相加以获得我的答案。问题是我不知道如何进行转换。

<小时/>

两张 3x3 图片的示例

# picture 1
[[[ 208., 208., 208.],
[ 0., 0., 0.],
[ 110., 110., 110.]],

[[ 161., 161., 161.],
[ 140., 140., 140.],
[ 251., 251., 251.]],

[[ 0., 0., 0.],
[ 55., 55., 55.],
[ 26., 26., 26.]]]

# picture 2
[[[ 88., 88., 88.],
[ 140., 140., 140.],
[ 0., 0., 0.]],

[[ 18., 18., 18.],
[ 112., 112., 112.],
[ 0., 0., 0.]],

[[ 0., 0., 0.],
[ 195., 195., 195.],
[ 5., 5., 5.]]]

# what I'd like
[[[ 2., 2., 2.],
[ 1., 1., 1.],
[ 1., 1., 1.]],

[[ 2., 2., 2.],
[ 2., 2., 2.],
[ 1., 1., 1.]],

[[ 0., 0., 0.],
[ 2., 2., 2.],
[ 2., 2., 2.]]]

最佳答案

假设这两个图像是名为 pic1 的 numpy 数组和pic2 :

pic1 = np.array(
[[[ 208., 208., 208.],
[ 0., 0., 0.],
[ 110., 110., 110.]],

[[ 161., 161., 161.],
[ 140., 140., 140.],
[ 251., 251., 251.]],

[[ 0., 0., 0.],
[ 55., 55., 55.],
[ 26., 26., 26.]]]
)

pic2 = np.array(
[[[ 88., 88., 88.],
[ 140., 140., 140.],
[ 0., 0., 0.]],

[[ 18., 18., 18.],
[ 112., 112., 112.],
[ 0., 0., 0.]],

[[ 0., 0., 0.],
[ 195., 195., 195.],
[ 5., 5., 5.]]]
)

您可以使用 np.array([pic1, pic2]) 创建这些图像的 numpy 数组或者如果您已经在列表中包含图像,则 np.array(list_of_arrays) 。然后,对该四维数组的每个元素单独应用逻辑运算,检查每个元素是否非零。最后,对指定 axis=0 的四维数组求和。 :

# Get a numpy array of images
images = np.array([pic1, pic2]) # or np.array(list_of_arrays)

# Check for nonzero values and sum along the relevant axis
result = (images != 0).sum(axis=0)

array([[[2, 2, 2],
[1, 1, 1],
[1, 1, 1]],

[[2, 2, 2],
[2, 2, 2],
[1, 1, 1]],

[[0, 0, 0],
[2, 2, 2],
[2, 2, 2]]])

如果图像已在列表中,则此方法可能不如其他方法快。也就是说,如果您在第一次创建图像集合时可以选择数据结构,并且可以使用 numpy 数组,那么这是最快的。

关于python - Numpy:查找非零值的出现,按索引分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36106498/

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