【问题标题】:Fast elementwise multiplication of a tensor by a list of vectors张量与向量列表的快速元素乘法
【发布时间】:2021-02-04 19:08:41
【问题描述】:

我有一个张量,我想将该张量乘以向量列表。下面是一个最小代码示例。

tensor=np.arange(4*5*6).reshape(4,5,6)
vectorList=[]
vectorList.append(np.array([0,1,2,3,4,5]))
vectorList.append(np.array([6,7,8,9,10,11]))
vectorList.append(np.array([12,13,14,15,16,17]))

results=[]
for i in vectorList:
  results.append(tensor*i)

这会产生所需的结果,但 for 循环只是太慢了。我似乎找不到一个 numpy/tensorflow 元素乘法命令,该命令将允许在向量列表堆叠后进行这种乘法运算。

如果这是一个问题,我愿意用内存换取速度。我也不关心结果的容器。张量列表或 4 维张量在这里都可以。

编辑:更新列表中的向量以使问题更清晰。

【问题讨论】:

  • 当您调用 tensor 时,您只是指 3d 数组,还是与 tensorflow 标记有某种关系?

标签: python numpy tensorflow


【解决方案1】:

您的 3d 数组(从 tensor 重命名):

In [448]: arr.shape
Out[448]: (4, 5, 6)

vectosList 因为数组是二维的:

In [449]: np.array(vectorList).shape
Out[449]: (3, 6)

你的结果,作为数组,是 4d:

In [450]: np.array(results).shape
Out[450]: (3, 4, 5, 6)

感谢您提供了一组漂亮的多样化维度。这样更容易跟踪它们。

我们可以通过广播生成相同的 4d 数组。我已经包含了所有的 ':' 只是为了突出维度是如何配对的:

In [451]: res = np.array(vectorList)[:,None,None,:]*arr[None,:,:,:]
In [452]: res.shape
Out[452]: (3, 4, 5, 6)
In [453]: np.allclose(res, np.array(results))
Out[453]: True

res=np.array(vectorList)[:,None,None]*arr 是一回事。

建议删除答案einsum,正确表达为np.einsum('il,jkl->ijkl',vectorList, arr)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2020-02-28
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多