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

inn6fuwd  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(202)

我有一个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)]

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

amrnrhlw

amrnrhlw1#

这可能会让你达到目的。你可以使用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]:

字符串

y3bcpkx1

y3bcpkx12#

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

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

xt0899hw

xt0899hw3#

尝试使用meshgrid的组合来生成坐标flattenreshape
在这个例子中,frame_height和frame_width是数组中的行数和列数。xy是圆心,radius是半径。

colnums, rownums = np.meshgrid(range(frame_width), range(frame_height))
    dist = np.sqrt(
        (colnums.flatten() - x) ** 2 + 
        (rownums.flatten() - y) ** 2
        )
    keep_mask = (dist < radius).reshape((frame_height, frame_width))
    indices = np.where(keep_mask)

字符串
这里我使用了一个真正的圆(不是菱形),但是你可以通过改变计算距离的方式来做任何你想要的形状。你还必须添加关于计数非零元素的部分(或者其他什么),但是一旦你有了indices,这就很容易了。
基本上,问题是布尔部分只能在一维数组上完成,所以你必须使用meshgrid,flatten和reshape。然后你可以将索引放回二维数组(使用np.where),或者如果你愿意,你可以使用布尔数组keep_mask
还可以看看np.unravel_index,它允许您将索引转换为扁平数组,将n维索引转换为任意形状的数组。

相关问题