Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 23, 2013 10:48:22

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

найти k ближайших векторов

надо найти k ближайших векторов
пример

data = np.random.rand(rows,cols)
vec= np.random.rand(1,cols)
d = ((data-vec)**2).sum(axis=1)  # compute distances
ndx = d.argsort()

затем я могу взять
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()

т.е. мне надо каким то образом выделить k индексов + значения из d1 и из d2, (наверно) слить их и взять k лучших.
наверно надо использовать dict? как то заполнить dict индекс + значение, потом слить 2 dict и сортировать и взять k лучших



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Отредактировано mrgloom (Окт. 23, 2013 10:51:54)

Офлайн

#2 Окт. 23, 2013 17:22:06

mrgloom
От:
Зарегистрирован: 2010-07-22
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

найти k ближайших векторов

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 = 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]

такой подход работает, только всё упирается в то что d надо держать в памяти + на непонятные ограничения самого memmap на размер массивов на х32.



___________________________________________________________________________________________
http://www.lfd.uci.edu/~gohlke/pythonlibs/
https://bitbucket.org/pypy/compatibility/wiki/Home

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version