【问题标题】:Dot product along third axis沿第三轴的点积
【发布时间】:2016-07-02 01:18:39
【问题描述】:

我正在尝试使用tensordot 在 numpy 中获取张量点积,但我不确定我应该如何重塑我的数组以实现我的计算。 (总的来说,我对张量的数学还是很陌生。)

我有

arr = np.array([[[1, 1, 1],
                [0, 0, 0],
                [2, 2, 2]],

               [[0, 0, 0],
                [4, 4, 4],
                [0, 0, 0]]])

w = [1, 1, 1]

我想在axis=2 上取一个点积,这样我就有了矩阵

array([[3, 0, 6],
       [0, 12, 0]])

什么是正确的 numpy 语法? np.tensordot(arr, [1, 1, 1], axes=2) 似乎引发了ValueError

【问题讨论】:

  • 更好的示例可能是 w = [1,2,3] 之类的,只是为了有一些变化。
  • 我设置了w = [1,1,1] 以表明我们只是试图将每个内部维度内的元素相加。
  • 如果您没有像w = [1,1,1] 那样缩放,那么它只是在arr 中沿axis=2 添加元素。因此,使用特定的w,您实际上不需要任何点积,只需将arr 的元素与axis=2 相加即可。

标签: python numpy tensor dot-product


【解决方案1】:

减少是沿着axis=2 用于arraxis=0 用于w。因此,使用np.tensordot,解决方案将是 -

np.tensordot(arr,w,axes=([2],[0]))

或者,也可以使用np.einsum -

np.einsum('ijk,k->ij',arr,w)

np.matmul 也可以使用

np.matmul(arr, w)

运行时测试-

In [52]: arr = np.random.rand(200,300,300)

In [53]: w = np.random.rand(300)

In [54]: %timeit np.tensordot(arr,w,axes=([2],[0]))
100 loops, best of 3: 8.75 ms per loop

In [55]: %timeit np.einsum('ijk,k->ij',arr,w)
100 loops, best of 3: 9.78 ms per loop

In [56]: %timeit np.matmul(arr, w)
100 loops, best of 3: 9.72 ms per loop

hlin117 在 Macbook Pro OS X El Capitan,numpy 版本 1.10.4 上测试。

【讨论】:

  • ...如果您有 Python 3.5,只需 arr @ w(或早期版本中的 np.matmul(arr, w));-)
  • @ajcr 最近听说过很多关于这个功能的消息,但我仍然无法使用它!得尽快试试。
  • @ajcr np.matmul(arr, w)可能是一个很好的替代解决方案!将其作为单独的答案发布?
  • 感谢您的时间!看看 tensordot 的速度有多快。
  • 不错的选项列表
【解决方案2】:

使用.dot 对我来说效果很好:

>>> import numpy as np
>>> arr = np.array([[[1, 1, 1],
                     [0, 0, 0],
                     [2, 2, 2]],

                    [[0, 0, 0],
                     [4, 4, 4],
                     [0, 0, 0]]])
>>> arr.dot([1, 1, 1])
array([[ 3,  0,  6],
       [ 0, 12,  0]])

虽然有趣的是比所有其他建议都慢

【讨论】:

    猜你喜欢
    • 2017-07-08
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多