获取半径内相邻元素的索引

时间:2019-05-26 21:12:17

标签: python-3.x numpy

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

矩阵如下:

Matrix

其中绿色是选定的单元格,黄色是周围的区域。

主要问题是环形或矢量化的移动模具。

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

r = 2
neighbor_coords = []
for i in list(itertools.product(range(-r, r+1), repeat=2)):
    if any(i) and np.sqrt(i[0]**2 + i[1]**2) <= r:
        neighbor_coords.append(i)

>>> [(-2, 0), (-1, -1), (-1, 0), (-1, 1), (0, -2), (0, -1), (0, 1), (0, 2), (1, -1), (1, 0), (1, 1), (2, 0)]

预期输出是相邻元素的索引或计数。

2 个答案:

答案 0 :(得分:1)

这可能会帮助您实现目标。您可以使用scipy中的convolve函数将矩阵与生成的内核进行卷积。以下将计算内核范围内的非零条目。请注意,我将输入矩阵转换为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]:        

答案 1 :(得分:1)

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

您当然可以在函数中输入数组本身