【问题标题】:Vectorization of Product Over产品向量化
【发布时间】:2021-11-04 13:24:00
【问题描述】:

我正在寻找以下计算的矢量化形式:

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 的存在让我有点失望。

编辑:减小矩阵的大小。

【问题讨论】:

  • 你能举一个更简单的例子吗?我没有 80GB 的内存。
  • 您的代码对我来说只是全零。这些是实际输入吗?
  • 没关系;只要表达正确。最小的例子是功能,而不是实用程序(我不能在这里上传我的原始矩阵)
  • 看起来你可能想要(X ** T[:, None]).prod(-1)
  • @user3483203。您可以在不损害概念的情况下减小任何尺寸...

标签: python numpy vectorization


【解决方案1】:

我正在尝试使广播尽可能明确 - 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)

【讨论】:

    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多