【问题标题】:Python: numpy.dot / numpy.tensordot for multidimensional arraysPython:用于多维数组的 numpy.dot / numpy.tensordot
【发布时间】:2020-10-02 14:28:43
【问题描述】:

我正在优化反向传播算法的实现以训练神经网络。我正在研究的一个方面是对一组数据点(输入/输出向量)执行矩阵运算,作为由 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 = (...))

(这是一个更复杂的应用程序的一部分,我构建事物的方式不再灵活。如果我找不到解决方案,我只会遍历数据集并为每个数据集执行乘法)

【问题讨论】:

标签: python numpy numpy-ndarray backpropagation tensordot


【解决方案1】:

我们可以使用np.einsum -

c = np.einsum('ijk,ilm->ijl',a,b)

由于最后一个轴是单例的,因此使用切片数组可能会更好 -

c = np.einsum('ij,il->ijl',a[...,0],b[...,0])

np.matmul/@-operator -

c = a@b.swapaxes(1,2)

【讨论】:

  • 您好 Divakar 非常感谢!这对我来说很完美。正是我想要的。我最终使用了您答案的第一个变体。另外我是stackoverflow的新手(发布问题),所以我不确定如何“接受”你的答案(我已经投了赞成票)。编辑:找到“接受”按钮:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多