在特定索引处将一个 numpy 数组与另一个 numpy 数组相乘

Multiplying a numpy array with another numpy array at a specific index

为了便于解释,我将使用二维 numpy 数组(我在我的问题中使用了 3 维数组)。

我有 2 个数组,一个记录了在那些特定坐标处发生某事的几率。另一个数组是一个预先生成的矩阵,用于在预定半径内降低围绕中心点的第一个数组的值。

我想在第一个矩阵(以下称为 A)中自动 select 点,并防止程序 select 另一个与之前 selected 点太近的点。所以我想将 selected 点周围的值乘以与该点的距离。

例如:

矩阵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] 被 select 编辑为兴趣点。 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] 周围的点没有足够的价值被 selected 作为兴趣点,除非条件足够高以至于无论如何都可以被 selected,因此乘法。

现在,我似乎想不出执行此特定乘法的方法。 numpy.multiply() 会重复 B,以便它应用于整个矩阵 A,而我只想将它应用于 A 的一小部分。

另一种选择是遍历矩阵 A 的受影响部分,但这需要大量时间(尤其是在 3 维矩阵中)

换句话说,我想应用一个卷积滤波器,而不是最后对乘法结果求和,而是将它们应用于卷积矩阵 (A) 的基础值

感谢您对此问题的任何见解。

最简单的解决方案是使用切片:

A[5:8, 8:11] = np.multiply(A[5:8,8:11], B)

这样做是从 A 中提取选定点(此处为 [6,9])周围的 3x3 区域,将其 (element-wise) 乘以 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)

(或者某种程度上,我没有测试这个变体)。