我使用NumPy面临内存和速度问题,但我的问题非常简单。
A
是H * W
整数的大型NumPy数组。V
是一个包含大型数组N
的{{1}}次视图的列表,每个视图都是相同的A
形状。(Hv, Wv)
是另一个包含与视图对应的K
浮点权重的列表。 N
Hv
几乎等于Wv
和H
但更小。由于NumPy views不是副本,因此即使W
很大,这对内存管理也很有用。
现在,我想使用广播速度计算一个新阵列: B = V 1 * K 1 + ... + V ñ子> * K <子>名词子>
这将产生一个新的N
加权数组。
问题在于,我不知道如何在内存中创建中间数组时执行此类操作(当视图与相应的权重相乘时会发生这种情况)并且同时受益于广播操作。
Hv * Wv
有人可以帮我巧妙地使用NumPy吗?
答案 0 :(得分:1)
我假设V
作为列表提供,我们无法优化创建或不需要。因此,A
不在等式中,我们留下V
和K
以获得最终输出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
更有意义,而不是在循环理解中导致一个清单。