我有一个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条答案
按热度按时间amrnrhlw1#
这可能会让你达到目的。你可以使用
scipy
中的卷积函数将你的矩阵与你生成的内核进行卷积。下面将计算内核范围内的非零项。请注意,我将输入矩阵转换为1,以便它对非零位置求和,而不是值。字符串
y3bcpkx12#
字符串
当然你可以在函数中输入数组本身
xt0899hw3#
尝试使用
meshgrid
的组合来生成坐标flatten
和reshape
。在这个例子中,frame_height和frame_width是数组中的行数和列数。
x
和y
是圆心,radius
是半径。字符串
这里我使用了一个真正的圆(不是菱形),但是你可以通过改变计算距离的方式来做任何你想要的形状。你还必须添加关于计数非零元素的部分(或者其他什么),但是一旦你有了
indices
,这就很容易了。基本上,问题是布尔部分只能在一维数组上完成,所以你必须使用meshgrid,flatten和reshape。然后你可以将索引放回二维数组(使用
np.where
),或者如果你愿意,你可以使用布尔数组keep_mask
。还可以看看
np.unravel_index
,它允许您将索引转换为扁平数组,将n维索引转换为任意形状的数组。