ОК Наскоро открих, че scipy.spatial.distance.cdist
Командата е много бърза за решаване на матрица COMPLETE между две векторни масиви за източник и дестинация. виж: Как може да се изчисли евклидовото разстояние с нупи?
Исках да се опитам да дублирам тези резултатипечалби при решаването на разстоянието между два равностойни масива. Разстоянието между два SINGLE вектора е доста право напред, за да се изчисли, както е показано в предишната връзка. Можем да вземем вектори:
import numpy as np
A=np.random.normal(size=(3))
B=np.random.normal(size=(3))
и след това използвайте "numpy.linalg.norm" където
np.linalg.norm(A-B)
е еквивалентно на
temp = A-B
np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2)
което работи добре обаче, когато искам да знам разстоянието между два комплекта вектори, където my_distance = distance_between( A[i], B[i] ) for all i
второто решение работи перфектно. По този начин:
A=np.random.normal(size=(3,42))
B=np.random.normal(size=(3,42))
temp = A-B
np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2)
ми дава набор от 42 разстояния между i
елемент на A
към i
елемент на B
, Докато norm
функцията правилно изчислява нормата зацялата матрица ми дава една единствена стойност, която не е това, което търся. Поведението с 42-те разстояния е това, което искам да запазя, надявам се с почти толкова голяма скорост, колкото и аз cdist
за решаване на пълни матрици. Така че въпросът е какъв най-ефективен начин да се използва Python и numpy / scipy i
разстояния между данните с формата (n,i)
?
Благодаря, Слоун
Отговори:
3 за отговор № 1Мисля, че вече сте се справили с повечето случаи. Вместо последния ви ред обаче ще използвам:
np.sqrt(np.sum(temp**2,0))
0 за отговор № 2
Ето времеви сравнения за двата метода, които според мен са най-подходящи:
import timeit
In[19]: timeit.timeit(stmt="np.linalg.norm(x-y,axis=0)", setup="import numpy as np; x,y = np.random.normal(size=(10, 100)), np.random.normal(size=(10, 100))", number=1000000)
Out[19]: 15.132534857024439
In[20]: timeit.timeit(stmt="np.sqrt(np.sum((x-y),axis=1))", setup="import numpy as np; x,y = np.random.normal(size=(10, 100)), np.random.normal(size=(10, 100))", number=1000000)
Out[20]: 9.417887529009022
Аз не съм изненадан, че методът numpy работи по-бързо. Вярвам, че Python подобрява, много от тези вградени функции ще бъдат подобрени.
Тестовете бяха проведени на анакондна питон версия 3.5.2