Numpy 广播 3-d 矩阵和 1d 向量

Numpy broadcast 3-d matrix and 1d vector

我有一个形状为 (N, N, T) 的矩阵 A。然后我有一个 V 形状的向量 (N,)。我想执行以下操作A[i, j, ...] = A[i, j, ...]*V[i]/V[j]。我正在使用以下循环执行此操作,但肯定有一种方法可以通过广播来完成。

A = np.random.randint(0, 5, (2, 2, 3))
V = np.array([2, 3]) 

for i in range(2):
    for j in range(2):
        A[i, j, ...] *= V[i]
        A[i, j, ...] /= V[j]

我考虑过使用 numpy 的逐元素乘法和广播来实现它,我尝试了像 A * V[:, None, None] 这样的方法,但总是出错。

有没有更有效的方法?

这是一种方法 -

(A*V[:,None,None])/V[:,None]

或者,分两步 -

A *= V[:,None,None]
A /= V[:,None]

利用 multi-coresnumexpr -

import numexpr as ne
ne.evaluate('A*V3D/V2D',{'V3D':V[:,None,None],'V2D':V[:,None]})

请注意,您可能会遇到错误,因为您可能正在对具有浮点结果的 int 数组进行编辑。因此,要么在开始时转换为浮点数组,要么使用一步法写入新数组。