乘积向量化
Vectorization of Product Over
我正在寻找以下计算的矢量化形式:
import numpy as np
D = 100
N = 1000
K = 10
X = np.random.uniform(0, 1, (K, N))
T = np.random.uniform(0, 1000, (D, N))
out = np.zeros((D, K))
for i in range(D):
for j in range(K):
out[i, j] = np.prod(X[j, :] ** T[i, :])
我尝试过 einsum 风格的东西,但是 np.prod 的存在让我有点失望。
编辑:减少矩阵的大小。
我试图让广播尽可能明确 - None
引入了一个额外的大小为 1 的虚拟维度:
out = np.prod(X[None, :, :] ** T[:, None, :], axis=2)
如果我们回忆这些形状,就很容易看出它是如何工作的:X.shape = (K, N)
、T.shape = (D, N)
和 out.shape = (D, K)
。对于虚拟维度,我们基本上取 (1, K, N)
的 (D, 1, N)
次方,结果是 (D, K, N)
。最后,如果我们通过乘积减少最后一个维度,我们将得到我们想要的输出 (D, K)
.
我正在寻找以下计算的矢量化形式:
import numpy as np
D = 100
N = 1000
K = 10
X = np.random.uniform(0, 1, (K, N))
T = np.random.uniform(0, 1000, (D, N))
out = np.zeros((D, K))
for i in range(D):
for j in range(K):
out[i, j] = np.prod(X[j, :] ** T[i, :])
我尝试过 einsum 风格的东西,但是 np.prod 的存在让我有点失望。
编辑:减少矩阵的大小。
我试图让广播尽可能明确 - None
引入了一个额外的大小为 1 的虚拟维度:
out = np.prod(X[None, :, :] ** T[:, None, :], axis=2)
如果我们回忆这些形状,就很容易看出它是如何工作的:X.shape = (K, N)
、T.shape = (D, N)
和 out.shape = (D, K)
。对于虚拟维度,我们基本上取 (1, K, N)
的 (D, 1, N)
次方,结果是 (D, K, N)
。最后,如果我们通过乘积减少最后一个维度,我们将得到我们想要的输出 (D, K)
.