【问题标题】:What is the most pythonic way to find all coordinate pairs in a numpy array that match a specific condition?在匹配特定条件的numpy数组中查找所有坐标对的最pythonic方法是什么?
【发布时间】:2019-06-19 19:57:48
【问题描述】:

所以给定一个由 1 和 0 组成的 2d numpy 数组,我想找到每个索引,其中它的值是 1 ,其顶部、左侧、右侧或底部由一个零。例如在这个数组中

0 0 0 0 0   
0 0 1 0 0   
0 1 1 1 0  
0 0 1 0 0  
0 0 0 0 0  

我只想要 (1,2)、(2,1)、(2,3) 和 (3,2) 的坐标,而不是 (2,2) 的坐标。

我创建了可以工作的代码并创建了两个坐标列表,类似于 numpy 非零方法,但是我不认为它非常“pythonic”,我希望有一种更好、更有效的方法来解决这个问题. (*注意这仅适用于用零填充的数组)

from numpy import nonzero
...
array= ... # A numpy array consistent of zeros and ones
non_zeros_pairs=nonzero(array)
coordinate_pairs=[[],[]]
for x, y in zip(temp[0],temp[1]):
    if array[x][y+1]==0 or array[x][y-1]==0 or array[x+1][y]==0 or array[x-1][y]==0:
             coordinate_pairs[0].append(x)
             coordinate_pairs[1].append(y)
...

如果 numpy 中存在可以为我处理这个问题的方法,那就太棒了。如果这个问题之前已经在stackoverflow上被问过/回答过,我很乐意删除这个,我只是很难找到任何东西。谢谢。

【问题讨论】:

    标签: python numpy numpy-ndarray


    【解决方案1】:

    设置

    import scipy.signal
    import numpy as np
    
    a = np.array([[0, 0, 0, 0, 0],
                  [0, 0, 1, 0, 0],
                  [0, 1, 1, 1, 0],
                  [0, 0, 1, 0, 0],
                  [0, 0, 0, 0, 0]])
    

    创建一个与每个值的四个方向匹配的窗口,以及convolve。然后,您可以检查元素是否为1,以及它们的卷积是否小于4,因为值==4意味着该值被1s包围

    window = np.array([[0, 1, 0],
                       [1, 0, 1],
                       [0, 1, 0]])
    
    m = scipy.signal.convolve2d(a, window, mode='same', fillvalue=1)
    
    v = np.where(a & (m < 4))
    
    list(zip(*v))
    

    [(1, 2), (2, 1), (2, 3), (3, 2)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-16
      • 2014-05-22
      • 2014-09-06
      • 2022-01-05
      • 2019-04-26
      • 2018-12-23
      • 1970-01-01
      • 2021-08-02
      相关资源
      最近更新 更多