2

我有一系列创建向量的生成器,例如:

vector = ( remainder(v, PRIME_NUMBER) for v in list_of_vectors)

我想生成一个包含矩阵行索引的向量,由上述生成器创建,其中包含最小值。

到目前为止,我有这个,使用 numpy:

minv = ones(n)*PRIME_NUMBER # n is the length of each vector
min_idx = zeros(n)
for i,r in enumerate(vector):
        min_idx = argmin(vstack((r,minv)),0)*min_idx
        min_idx = [x if x>0 else i for x in min_idx]
        minv = amin(vstack((minv,r)),0)

当然,这太慢了(至少对于我的应用程序而言)。我想知道是否有更快的方法来做到这一点!

我期待找到一种方法来做到这一点,就像我只获得最小值一样:

minvalues = reduce(lambda x,y: amin(vstack((x,y)),0) , vector)

编辑:一个有一些修改的工作示例:

from numpy import random, zeros, remainder

PRIME_NUMBER = 109297
dim = 100
list_of_vectors = random.rand(1000,dim)

vector = ( remainder(v, PRIME_NUMBER) for v in list_of_vectors)

min_idx = [(0,PRIME_NUMBER)]*dim
for i,r in enumerate(vector):
        min_idx = map(lambda x: (i,x[0]) if x[0]<x[1][1] else x[1] , zip(r,min_idx))

这段代码的运行速度比前一个快 50%,但我仍然认为还有一些改进的空间。

4

1 回答 1

0

这是我认为您想要做的一个非常简单的版本,它的运行速度比您的代码快几倍。

vector = (np.remainder(v,PRIME_NUMBER) for v in list_of_vectors.T)
min_idx=[np.argmin(slice) for slice in vector)]

诀窍是注意到这一点dim << len(vector),因此是切开的正确项目。您无法使用已定义的生成器执行此操作。

如果您绝对必须使用给定的生成器,您可以使用例如vector=np.array([v for v in vector]).T. 但这完全违背了使用生成器的目的。

于 2013-06-06T15:17:18.407 回答