python - Python:用于多维数组的 numpy.dot / numpy.tensordot
问题描述
我正在优化反向传播算法的实现以训练神经网络。我正在研究的一个方面是对一组数据点(输入/输出向量)执行矩阵运算,作为由 numpy 库优化的批处理,而不是循环遍历每个数据点。
在我原来的算法中,我做了以下事情:
for datapoint in datapoints:
A = ... (created out of datapoint info)
B = ... (created out of datapoint info)
C = np.dot(A,B.transpose())
____________________
A: (7,1) numpy array
B: (6,1) numpy array
C: (7,6) numpy array
然后我将所述矩阵扩展为张量,其中第一个形状索引将引用数据集。如果我有 3 个数据集(为简单起见),矩阵将如下所示:
A: (3,7,1) numpy array
B: (3,6,1) numpy array
C: (3,7,6) numpy array
仅使用 np.tensordot 或其他 numpy 操作,如何生成 C?
我假设答案看起来像这样:
C = np.tensordot(A.[some manipulation], B.[some manipulation], axes = (...))
(这是一个更复杂的应用程序的一部分,我构建事物的方式不再灵活。如果我找不到解决方案,我只会遍历数据集并为每个数据集执行乘法)
解决方案
我们可以使用np.einsum
-
c = np.einsum('ijk,ilm->ijl',a,b)
由于最后一个轴是单例的,因此使用切片数组可能会更好 -
c = np.einsum('ij,il->ijl',a[...,0],b[...,0])
c = a@b.swapaxes(1,2)
推荐阅读
- html - 如何设置单个内联块元素的样式
- python - 在具有巨大数据框的 pyspark 中使用 pandas_udf 时的性能
- hadoop - 是否可以在 hive 2.1.1 上读取镶木地板 INT64 时间戳?
- r - 拟合局部级别的泊松(状态空间模型)
- javascript - 未能构造“CustomElement”:结果不能有父级
- php - 如何验证此 PHP 联系表单中的电子邮件?
- bash - 登录后,fish shell 登录命令继续在屏幕或 tmux 会话上运行
- docker - docker 容器之间通信的最佳实践
- javascript - Rails 和 JS,如何在我看来最好地获取输入日期
- php - 如何将 Serializer 注释转换为 YML 或 XML 配置?