如何有效地将NumPy视图列表与相应的权重相乘?

时间:2016-07-02 13:16:51

标签: python arrays numpy optimization memory-management

我使用NumPy面临内存和速度问题,但我的问题非常简单。

  • AH * W整数的大型NumPy数组。
  • V是一个包含大型数组N的{​​{1}}次视图的列表,每个视图都是相同的A形状。
  • (Hv, Wv)是另一个包含与视图对应的K浮点权重的列表。

N Hv几乎等于WvH但更小。由于NumPy views不是副本,因此即使W很大,这对内存管理也很有用。

现在,我想使用广播速度计算一个新阵列: B = V 1 * K 1 + ... + V ñ * K <子>名词

这将产生一个新的N加权数组。

问题在于,我不知道如何在内存中创建中间数组时执行此类操作(当视图与相应的权重相乘时会发生这种情况)并且同时受益于广播操作。

Hv * Wv

有人可以帮我巧妙地使用NumPy吗?

1 个答案:

答案 0 :(得分:1)

我假设V作为列表提供,我们无法优化创建或不需要。因此,A不在等式中,我们留下VK以获得最终输出B,因此,优化最后一步。

为了解决这个问题,我们可以使用np.tensordot来代替减法的最后一步,因为它基本上是矩阵乘法的减少。在我们的例子中,我们正在从K和输入列表V的长度减少第一个轴。在内部,NumPy会将列表转换为NumPy张量数组,该长度将成为其数组版本的第一个轴。因此,我们将从这两个输入中减少第一个轴,因此实现将是 -

B = np.tensordot(K,V,axes=[0,0]) # `axes` indicates the axes to be sum-reduced

请注意,列表到NumPy数组的内部转换可能并不便宜,因此使用初始化作为NumPy数组创建V更有意义,而不是在循环理解中导致一个清单。