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-cores
和 numexpr
-
import numexpr as ne
ne.evaluate('A*V3D/V2D',{'V3D':V[:,None,None],'V2D':V[:,None]})
请注意,您可能会遇到错误,因为您可能正在对具有浮点结果的 int 数组进行编辑。因此,要么在开始时转换为浮点数组,要么使用一步法写入新数组。
我有一个形状为 (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-cores
和 numexpr
-
import numexpr as ne
ne.evaluate('A*V3D/V2D',{'V3D':V[:,None,None],'V2D':V[:,None]})
请注意,您可能会遇到错误,因为您可能正在对具有浮点结果的 int 数组进行编辑。因此,要么在开始时转换为浮点数组,要么使用一步法写入新数组。