在numpy数组中找到与特定条件匹配的所有坐标对的最有效方法是什么?

时间:2019-06-19 19:57:48

标签: python numpy numpy-ndarray

因此,给定一个由1和0组成的2d numpy数组,我想查找每个索引中值为的索引,其中其顶部,左侧,右侧或底部包括零。例如在此数组

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上问过/回答过这个问题,我很乐意将其删除,我很难找到任何东西。谢谢。

1 个答案:

答案 0 :(得分:3)

设置

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)]