python - 乘积向量化

标签 python numpy vectorization array-broadcasting

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

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)。最后,如果我们在最后一个维度上减少 via 产品,我们将得到我们想要的 (D, K) 输出。

关于python - 乘积向量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69839952/

相关文章:

python - 删除 Numpy 中重新排列的数组

python - 从向量化的二维数组中获取值

python - 沿指定轴的两个 numpy 数组的外部总和

python - 具有 "if"条件的一行多变量值赋值

python - NDB 使用 Users API 形成实体组

python - 使用 numpy.argpartition 忽略 NaN

python - 在 Numpy 中以编程方式沿其所有轴裁剪数组

处理 None 和 with Statement 的 Pythonic 方法

python - 将网络抓取的结果分组到各个部分

python - Numpy 逐元素比较