【问题标题】:How to multiply two lists to matrices to a tensor?如何将两个列表乘以矩阵到张量?
【发布时间】:2017-06-26 22:38:32
【问题描述】:

我有两个数组列表

splocations = [array([1,2,3]),array([4,5,6]),array([7,8,9])]
eviddisp = [array([10,11,12]), array([13,14,15])]

我想将其相互相乘,以便将每个列表元素(它是一个数组)与其他列表元素相乘。在这里,我会得到一个 3x2 矩阵,其中每个元素都是一个向量。所以矩阵元素 [0,0] 将是

array([10, 22, 36]) = array([1,2,3]) * array([10,11,12])

所以这个矩阵实际上是一个形状为 3x2x3 的张量。我怎样才能得到这个张量/矩阵?

我知道我需要以某种方式使用array(splocations)array(eviddisp)。我意识到,我正在寻找 numpy 的 tensordot 的解决方案,但我做的不对。我该如何进行?

【问题讨论】:

  • [splocations[i] * eviddisp[i] for i in range(2)]?
  • @Divakar:那是非常低效的。我正在寻找一个 numpy 解决方案。
  • a[:2]*bab 分别为array(splocations) and array(eviddisp)
  • @Divakar:这会产生一个 3x2 的矩阵,而不是请求的张量。
  • 然后,试试a[:,None]*b

标签: python arrays numpy matrix


【解决方案1】:

考虑到自动广播,我认为这就是您想要的:

from numpy import array

splocations = [array([1,2,3]),array([4,5,6]),array([7,8,9])]
eviddisp = [array([10,11,12]), array([13,14,15])]

splocations = array(splocations)
viddisp = array(eviddisp)

result = splocations[:, None, :]*eviddisp

result

array([[[ 10,  22,  36],
        [ 13,  28,  45]],

       [[ 40,  55,  72],
        [ 52,  70,  90]],

       [[ 70,  88, 108],
        [ 91, 112, 135]]])

【讨论】:

  • 您可以使用等效但更简洁的语法:splocations = np.array([[1,2,3], [4,5,6], [7,8,9]])。另请注意,您可以在乘法步骤中不使用最终的: 来执行相同的操作(如评论中的@Divakar 所示)。
  • 我刚刚从 OP 的代码开始。我同意直接创建更好,但也许他真的有一个数组列表。我也喜欢明确指定所有索引。清楚地表明结果是三维的
  • 有时我什至会写a[:,None,:] * b[None,:,:] 来突出维度配对。
猜你喜欢
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 2018-12-09
  • 2020-06-05
相关资源
最近更新 更多