为了便于解释,我将使用二维numpy数组(我在我的问题中使用三维数组)。
我有2个数组,一个记录在这些特定坐标处发生的事情的几率。另一个阵列是预生成的矩阵,用于在预定半径内降低围绕中心点的第一阵列的值。
我想自动选择第一个矩阵(以下称A)中的点,并阻止程序选择与之前选择的点太接近的另一个点。所以我想将选定点周围的值乘以与距离点相距的距离。
E.G:
矩阵A:
[[0, 0, 0, 0, 0, 0],
[0, 1, 2, 2, 1, 0],
[0, 2, 4, 4, 2, 0],
[0, 2, 4, 4, 2, 0],
[0, 1, 2, 2, 1, 0],
[0, 0, 0, 0, 0, 0]]
矩阵B:
[[ 1, 0.5, 1 ],
[0.5, 0, 0.5],
[ 1, 0.5, 1 ]]
现在说选择索引[2,1]作为兴趣点。 B乘以A,但仅与[2,1]
中的3 * 3值相乘结果:
[[0, 0, 0, 0, 0, 0],
[0, 0.5, 0, 1, 1, 0],
[0, 2, 2, 4, 2, 0],
[0, 2, 4, 4, 2, 0],
[0, 1, 2, 2, 1, 0],
[0, 0, 0, 0, 0, 0]]
这应该导致[2,1]周围的点不足以被选择为兴趣点,除非条件足够高以至于无论如何都被选择,因此乘法。
现在,我似乎无法找到执行此特定乘法的方法。 numpy.multiply()
将重复B,以便将其应用于整个矩阵A,而我只想将其应用于A的一小部分。
另一种选择是循环在受影响的矩阵A部分,但这需要一个疯狂的时间(特别是在三维矩阵中)
换句话说,我想应用卷积滤波器而不总结最后的乘法结果,但是将它们应用于卷积矩阵的基础值(A)
对此问题的任何见解表示赞赏。
答案 0 :(得分:0)
最简单的解决方案是使用切片:
A[5:8, 8:11] = np.multiply(A[5:8,8:11], B)
这样做是从选定点周围的3x3区域(此处为[6,9])中提取,将其(按元素方式)乘以B,然后将其写回到同一位置。
由于你谈到了卷积,如果你想使用它的方法是创建一个与A相同形状的矩阵M,但除了在选定的点以外,它都是零。这个矩阵可以与B卷积,然后乘以A:
M = np.zeros(A.shape)
M[6,9] = 1
M = scipy.ndimage.filters.convolve(M, B)
A = np.multiply(A, M)
(或者在某种程度上,我没有测试这个变体)。