在Python + Numpy中查找生成器最小值的列式索引

时间:2013-05-30 20:41:06

标签: python numpy

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

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%,但我仍然认为还有一些改进空间。

1 个答案:

答案 0 :(得分: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。但这完全违背了使用发电机的目的。