我想在我的numpy矩阵中找到一个点的范围1(或完全对角线)内的点的列表:
例如说我的矩阵m
是:
[[0 0 0 0 0]
[0 0 0 0 0]
[0 0 1 0 0]
[0 0 0 0 0]
[0 0 0 0 0]]
我想获取一个元组列表或一些表示以下带有X的9点的所有坐标的东西:
[[0 0 0 0 0]
[0 X X X 0]
[0 X X X 0]
[0 X X X 0]
[0 0 0 0 0]]
这是另一个示例,目标点位于边缘:
[[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 1]
[0 0 0 0 0]
[0 0 0 0 0]]
在这种情况下,距目标点1的距离内只有6个点:
[[0 0 0 0 0]
[0 0 0 X X]
[0 0 0 X X]
[0 0 0 X X]
[0 0 0 0 0]]
编辑:
在这里使用David Herrings有关切比雪夫距离的答案/评论是我尝试解决上述示例2的尝试,假设我知道目标点的坐标:
from scipy.spatial import distance
point = [2, 4]
valid_points = []
for x in range(5):
for y in range(5):
if(distance.chebyshev(point, [x,y]) <= 1):
valid_points.append([x,y])
print(valid_points) # [[1, 3], [1, 4], [2, 3], [2, 4], [3, 3], [3, 4]]
对于更大的数组,这似乎效率不高,因为我只需要检查一小部分单元格,而不是整个martix。
答案 0 :(得分:1)
这里没有感兴趣的算法。如果您还没有知道 1的位置,则首先必须找到它,并且做的最好不过是搜索每个元素。 (通过使用numpy
以argmax
以C速度执行此操作,您可以 获得恒定因子加速;使用divmod
将展平的索引分为行和列。)之后,您要做的就是将坐标加±1(或0),除非它会使您超出数组范围。您永远都不会构造坐标以便以后将其丢弃。
答案 1 :(得分:0)
我认为您正在使它过于复杂-无需依赖复杂的功能
queue
答案 2 :(得分:0)
一种简单的方法是使用笛卡尔积获得所有可能的坐标
设置数据:
x = np.array([[0,0,0], [0,1,0], [0,0,0]])
x
array([[0, 0, 0],
[0, 1, 0],
[0, 0, 0]])
您知道坐标将是您所在位置的+/- 1:
loc = np.argwhere(x == 1)[0] # unless already known or pre-specified
v = [loc[0], loc[0]-1, loc[0]+1]
h = [loc[1], loc[1]-1, loc[1]+1]
output = []
for i in itertools.product(v, h):
if not np.any(np.array(i) >= x.shape[0]) and not np.any(np.array(i) < 0): output.append(i)
print(output)
[(1, 1), (1, 0), (1, 2), (0, 1), (0, 0), (0, 2), (2, 1), (2, 0), (2, 2)]