我有一系列创建向量的生成器,例如:
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%,但我仍然认为还有一些改进的空间。