data = np.random.rand(rows,cols)
vec= np.random.rand(1,cols)
d = ((data-vec)**2).sum(axis=1) # compute distances
ndx = d.argsort()
比我能拿的第一个 k
ndx[:k]
但如果有
d1 = ((data1-vec)**2).sum(axis=1) # compute distances
ndx1 = d1.argsort()
d2 = ((data2-vec)**2).sum(axis=1) # compute distances
ndx2 = d2.argsort()
我需要连接 ndx1+ndx2 的值+索引并按值排序(从 2k 个向量中取 k 个最近的向量)。
怎么做到呢?我需要使用字典吗?
更新:
我不能堆叠 data1 和 data2 因为它不适合 RAM。我使用 numpy.memmap 按块读取我的大数组(1 个块 = 数据)。
例如,这有效,但仅适用于小尺寸。所以我需要按块迭代地处理数据。
import numpy as np
import time
rows = 10000
cols = 1000
batches = 5
k= 10
fp = np.memmap('C:/memmap_test', dtype='float32', mode='w+', shape=(rows*batches,cols))
vec= np.random.rand(1,cols)
t0= time.time()
d = ((fp-vec)**2).sum(axis=1) # compute distances
ndx = d.argsort()
print (time.time()-t0)
print ndx[:k]
这种方法不起作用:
ValueError:对象不对齐
t0= time.time()
d = np.empty((rows*batches,))
for i in range(batches):
d[i*rows:(i+1)*rows] = (np.einsum('ij,ij->i', fp[i*rows:(i+1)*rows], fp[i*rows:(i+1)*rows]) + np.dot(vec, vec) -
2 * np.dot(fp[i*rows:(i+1)*rows], vec))
print (time.time()-t0)
这似乎有效
t0= time.time()
d = np.empty((rows*batches,))
for i in range(batches):
d[i*rows:(i+1)*rows] = ((fp[i*rows:(i+1)*rows]-vec)**2).sum(axis=1)
ndx = d.argsort()
print (time.time()-t0)
print ndx[:k]