Python 3.x 获取半径内相邻元素的索引
我有一个NxN矩阵,我想为矩阵中的每个元素找到半径R内非零元素的索引(或至少计数)。这个矩阵会很大,所以我计划使用Numpy进行计算,我需要索引,因为这个矩阵通过数据存储(一个python对象列表[[])链接到另一个矩阵 矩阵如下所示: 其中绿色为选定单元格,黄色为周围区域 主要问题是移动模具,无论是循环还是矢量化 我尝试了以下代码,该代码给出了相对于点的正确坐标(均在半径范围内,不包括中心),但我不知道如何将其应用于numpy数组:Python 3.x 获取半径内相邻元素的索引,python-3.x,numpy,Python 3.x,Numpy,我有一个NxN矩阵,我想为矩阵中的每个元素找到半径R内非零元素的索引(或至少计数)。这个矩阵会很大,所以我计划使用Numpy进行计算,我需要索引,因为这个矩阵通过数据存储(一个python对象列表[[])链接到另一个矩阵 矩阵如下所示: 其中绿色为选定单元格,黄色为周围区域 主要问题是移动模具,无论是循环还是矢量化 我尝试了以下代码,该代码给出了相对于点的正确坐标(均在半径范围内,不包括中心),但我不知道如何将其应用于numpy数组: r=2 邻居协调=[] 对于列表中的i(itertools
r=2
邻居协调=[]
对于列表中的i(itertools.product(范围(-r,r+1),重复=2)):
如果有任何(i)和np.sqrt(i[0]**2+i[1]**2)>[(-2,0),(-1,-1),(-1,0),(-1,1),(0,-2),(0,-1),(0,2),(1,-1),(1,0),(1,1),(2,0)]
预期的输出是相邻元素的索引或计数。这可能会让您在一定程度上达到目标。您可以使用
scipy
中的卷积函数将矩阵与生成的内核进行卷积。下面的内容将统计内核范围内的非零项。请注意,我将输入矩阵转换为1,以便对非零位置求和,而不是对值求和
In [74]: import numpy as np
In [75]: from scipy.ndimage.filters import *
In [76]: a
Out[76]:
array([[1, 2, 0, 0],
[1, 1, 0, 0],
[0, 0, 0, 0],
[5, 5, 5, 5]])
In [77]: a_ones = np.where(a>0, 1, 0)
In [78]: a_ones
Out[78]:
array([[1, 1, 0, 0],
[1, 1, 0, 0],
[0, 0, 0, 0],
[1, 1, 1, 1]])
In [79]: k
Out[79]:
array([[0, 1, 0],
[1, 0, 1],
[0, 1, 0]])
In [80]: convolve(a_ones, k, mode='constant')
Out[80]:
array([[2, 2, 1, 0],
[2, 2, 1, 0],
[2, 2, 1, 1],
[1, 2, 2, 1]])
In [81]:
定义查找索引(阵列、中心、半径):
... a=np.索引(数组.形状).重塑(2,-1).T
... 返回[np.abs(a-np.array(center)).sum(1)>>find_ind(np.zeros((7,7)),[4,4],2)
数组([-2,0],
[-1, -1],
[-1, 0],
[-1, 1],
[ 0, -2],
[ 0, -1],
[ 0, 0],
[ 0, 1],
[ 0, 2],
[ 1, -1],
[ 1, 0],
[ 1, 1],
[ 2, 0]])
当然,您可以在使用欧几里德距离的函数中输入数组本身。如果半径为3或更大,这将不起作用。您不必使用城市街区距离
>>> def find_ind(array,center,radius):
... a = np.indices(array.shape).reshape(2,-1).T
... return a[np.abs(a-np.array(center)).sum(1)<=int(radius)]-np.array(center)
...
>>> find_ind(np.zeros((7,7)),[4,4],2)
array([[-2, 0],
[-1, -1],
[-1, 0],
[-1, 1],
[ 0, -2],
[ 0, -1],
[ 0, 0],
[ 0, 1],
[ 0, 2],
[ 1, -1],
[ 1, 0],
[ 1, 1],
[ 2, 0]])