我有一个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)]
预期输出是相邻元素的索引或计数。
答案 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]])
您当然可以在函数中输入数组本身