【问题标题】:get the values in a given radius from numpy array [duplicate]从numpy数组中获取给定半径的值[重复]
【发布时间】:2023-03-20 05:43:01
【问题描述】:

我想在 python 的二维 numpy 数组中围绕给定值恢复“缓冲区”。这个想法是选择给定半径内包含的所有值,然后将它们屏蔽。它会是这样的:

  1. 在矩阵中选择一个“单元格”,如matrix[x, y]
  2. 获取邻域中包含的单元格,其中与x, y 的距离小于半径r

我想为此实现一个快速函数,因为我有一个大数组要处理(形状为 7000 x 10000)。

【问题讨论】:

  • 你能定义“距离”吗?
  • [x-n:x+1+n, y-n:y+1+n

标签: python arrays numpy mask spatial-query


【解决方案1】:

numpy 切片开箱即用,速度非常快:

x
Out[38]: 
array([[1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4]])

x[0:3,0:3] #neighbors distance=1 from (1,1)
Out[39]: 
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

如果你想概括这个,写一个包装器:

def n_closest(x,n,d=1):
    return x[n[0]-d:n[0]+d+1,n[1]-d:n[1]+d+1]

演示:

y = np.diag(np.ones(10))

n_closest(y,(1,3))
Out[67]: 
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 1.,  0.,  0.]])

n_closest(y,(2,3),d=2)
Out[69]: 
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.]])

这是一个基本的“方形”面具,如果您需要不同形状的面具,很容易制作。目前还不清楚这是否是您想要的。

【讨论】:

  • 只有当你假设他的意思是距离是 L-infinity 范数时,这才是正确的。
  • 谢谢,这似乎有效。我正在尝试弄清楚如何制作圆盘形状。
  • @Guadancil11 那么是的,您正在寻找stackoverflow.com/questions/8647024/…。同样的策略也适用,您只是使用np.ogrid 进行切片。
  • 我想我没抓住重点。我做: >>> ax,ay=ogrid[xd:x+d+1,yd:y+d+1] >>> mask = axax + ayay
  • 实际上完全不同...在您的回答中,您正在创建原始数据的视图。在另一种情况下,您正在创建一个布尔掩码,可用于访问原始数据的扁平副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
相关资源
最近更新 更多