Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 获取半径内相邻元素的索引_Python 3.x_Numpy - Fatal编程技术网

Python 3.x 获取半径内相邻元素的索引

Python 3.x 获取半径内相邻元素的索引,python-3.x,numpy,Python 3.x,Numpy,我有一个NxN矩阵,我想为矩阵中的每个元素找到半径R内非零元素的索引(或至少计数)。这个矩阵会很大,所以我计划使用Numpy进行计算,我需要索引,因为这个矩阵通过数据存储(一个python对象列表[[])链接到另一个矩阵 矩阵如下所示: 其中绿色为选定单元格,黄色为周围区域 主要问题是移动模具,无论是循环还是矢量化 我尝试了以下代码,该代码给出了相对于点的正确坐标(均在半径范围内,不包括中心),但我不知道如何将其应用于numpy数组: r=2 邻居协调=[] 对于列表中的i(itertools

我有一个NxN矩阵,我想为矩阵中的每个元素找到半径R内非零元素的索引(或至少计数)。这个矩阵会很大,所以我计划使用Numpy进行计算,我需要索引,因为这个矩阵通过数据存储(一个python对象列表[[])链接到另一个矩阵

矩阵如下所示:

其中绿色为选定单元格,黄色为周围区域

主要问题是移动模具,无论是循环还是矢量化

我尝试了以下代码,该代码给出了相对于点的正确坐标(均在半径范围内,不包括中心),但我不知道如何将其应用于numpy数组:

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