/ / Най-бързият начин да изчислим евклидовото разстояние между 2 комплекта вектори, използвайки numpy или scipy - numpy, scipy, python-2.x, euclidean-distance

Най-бърз начин да изчислите разстоянието между евклидовете между 2 набора от вектори, използващи множество или scipy - numpy, scipy, python-2.x, euclidean-distance

ОК Наскоро открих, че 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