【发布时间】:2016-07-02 22:09:51
【问题描述】:
我在使用 NumPy 时遇到内存和速度问题,但我的问题很简单。
-
A是一个由H * W整数组成的大型 NumPy 数组。 -
V是一个列表,其中包含N大数组A的视图,每个视图都具有相同的(Hv, Wv)形状。 -
K是另一个列表,其中包含与视图对应的N浮动权重。
Hv 是 Wv 几乎等于 H 和 W 但更小。由于NumPy views 不是副本,这对于内存管理非常有用,即使N 很大。
现在,我想使用广播计算一个新数组以提高速度:B = V1*K1 + ... + V N*KN
这将产生一个新的Hv * Wv 加权数组。
问题是我不知道如何在不在内存中创建中间数组(当视图乘以相应的权重时会发生这种情况)并从广播操作中受益的情况下执行此类操作。
import numpy as np
H = W = 1000
Hv = Wv = 900
N = 100
A = np.arange(H * W).reshape(H, W)
V = [A[i:Hv + i, i:Wv + i] for i in range(N)]
K = np.random.rand(N)
# It neither uses speed broadcast nor low memory!
B = sum(v*k for v, k in zip(V, K))
有人可以帮我巧妙地使用 NumPy 吗?
【问题讨论】:
-
看来
A有重量?因此,使用其中包含随机数的样本而不是仅使用ones会更合理,对吧? -
你没有过度简化:
V = [A[:Hv, :Wv] for _ in range(N)]因为 V[0]、V[1] 等会是一样的吗? -
@Divakar 我认为这足以理解问题,但这是真的,它看起来一点也不像真实数据。我用一系列滑动对角线视图更新了我的问题,我希望它会更好(但它可以工作,因为
N = H - Hv否则会引发错误)。 -
没有固定的方法可以用来创建
V吗?所以,我想我们可以说V会被给出,我们不需要担心优化创建V? -
@Divakar 没错!我有足够的时间创建
A、V和K,但我经常需要更新B的一些值(这也是我使用视图的原因)。我只关心创建B时的速度和内存管理。
标签: python arrays numpy optimization memory-management