【问题标题】:Obtain the indices of neighboring elements within a radius获取半径内相邻元素的索引
【发布时间】:2019-05-27 07:07:30
【问题描述】:

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

矩阵如下所示:

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

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

我尝试了以下代码,它给出了相对于该点的正确坐标(全部在半径范围内且不包括中心),但我不知道如何将其应用于 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)]

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

【问题讨论】:

  • 您使用的是欧式距离。如果您的半径为 3 或更大,这将不起作用。你应该使用街区距离

标签: python-3.x numpy


【解决方案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]])

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

【讨论】:

    【解决方案2】:

    这可能会让你走上正轨。您可以使用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]:        
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多