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

时间:2018-02-19 20:55:21

标签: python python-3.x numpy simpleitk

为了便于解释,我将使用二维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)

对此问题的任何见解表示赞赏。

1 个答案:

答案 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)

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