我有一系列创建矢量的生成器,例如:
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%,但我仍然认为还有一些改进空间。
答案 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
。但这完全违背了使用发电机的目的。