在匹配特定条件的 numpy 数组中查找所有坐标对的最 pythonic 方法是什么?
What is the most pythonic way to find all coordinate pairs in a numpy array that match a specific condition?
因此,给定一个由 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 中存在可以为我处理此问题的方法,那就太棒了。如果这个问题之前已经在 Whosebug 上 asked/answered,我会很乐意将其删除,我只是在努力寻找任何东西。谢谢。
设置
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]])
创建一个 window 匹配每个值的四个方向,以及 convolve
。然后,您可以检查元素是否为 1
,以及它们的卷积是否小于 4
,因为值 ==4
意味着该值被 1s
[=18 包围=]
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)]
因此,给定一个由 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 中存在可以为我处理此问题的方法,那就太棒了。如果这个问题之前已经在 Whosebug 上 asked/answered,我会很乐意将其删除,我只是在努力寻找任何东西。谢谢。
设置
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]])
创建一个 window 匹配每个值的四个方向,以及 convolve
。然后,您可以检查元素是否为 1
,以及它们的卷积是否小于 4
,因为值 ==4
意味着该值被 1s
[=18 包围=]
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)]