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

标签 python numpy

我有一个 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/

相关文章:

python - 矩阵移位的问题

python - 遍历多维数组

python - Numpy Sum 当每个数组都有特定值时

python - 用相同的行名融合两个数据帧

python - 如何在python中比较两个数组,并根据有效值获取 bool 输出

python - 替换 numpy ndarray 中的字符(Python)

python - 按索引和列名数组对 Pandas 数据框进行切片

python - 如何将数据库路由器添加到 Django 项目

python - 尝试使用 urwid 创建控制台屏幕时出现“断言错误”

python - Scipy - 如何进一步优化随机梯度下降的稀疏矩阵代码