numpy - 如何向量化以下python代码
问题描述
我正在尝试获取一个矩阵,其中每个元素的计算方式如下:
X = torch.ones(batch_size, dim)
X_ = torch.ones(batch_size, dim)
Y = torch.ones(batch_size, dim)
M = torch.zeros(batch_size, batch_size)
for i in range(batch_size):
for j in range(batch_size):
M[i, j] = ((X[i] - X_[i] * Y[j])**2).sum()
逐元素计算非常慢M
,有没有关于如何使用矩阵乘法来替换 for 循环的建议?
谢谢。
解决方案
如果你想sum()
过度调暗,你可以将你的 2D 问题“提升”到 3D 并在那里求和:
M = ((X[:, None, :] - X_[:, None, :] * Y[None, ...])**2).sum(dim=2)
它是如何工作的:
X[:, None, :]
并且X_[:, None, :]
是 3D 的大小(batch_size, 1, dim)
,并且Y[None, ...]
是大小(1, batch_size, dim)
。
当乘以X_[:, None, :] * Y[None, ...]
pytorch时,将 size 1 的维度广播到适当的维度以获得 size 的结果(batch_size, batch_size, dim)
。
最后,您sum()
只需在最后一个维度上获得size(dim=2)
的输出。M
(batch_size, batch_size)
这里的诀窍是利用广播来完成的。
推荐阅读
- macos - 通过自制软件安装的任何东西都会抛出“找不到命令”
- sql - Sql select - 如果为空,如何从其他表中选择
- bash - 文件消失而不是重命名
- node.js - 找不到模块'source-map-support/register
- python - Keras:模型预测,检查输入形状时出错
- javascript - 如何用相同代码的扩展片段替换代码字符串中的“特殊”字符?
- docker - Docker-Compose:如何等待其他服务准备好?
- r - 在 dplyr 中的列表中求和
- javascript - JSX 错误:“JSX.IntrinsicElements”类型上不存在属性
- typescript - 为什么 TypeScript 在嵌套对象中不能推断出泛型类型?