kAIST
@kAIST

NumPy как переписать алгоритм?

На входе один numpy массив и так же множество массивов, с которым его нужно сравнить и выдать те, которые наиболее "похожи". Делается это так:
input_array= np.array(....)
many_arrays=[np.array(....),np.array(....), .... ]
dists = np.linalg.norm(many_arrays-input_array, axis=1) 
ids = np.argsort(dists)[:20] #получаем первые 20 индексов максимально "похожих" на input_array

А как быть, если input_array это не один массив, а N массивов? То есть нужно получить список массивов, которые максимально похоже ко всем из input_array?
Хочется максимально элегантного решения, вдруг оно делается в пару строк )
  • Вопрос задан
  • 72 просмотра
Пригласить эксперта
Ответы на вопрос 2
@dmshar
Ну, в пару или нет - считайте сами:

import itertools
import numpy as np
many_arrays=[np.array([1,2,3]),np.array([4,5,6]), np.array([7,8,9]) ]
many_arrays2=[np.array([1,2,3]),np.array([4,5,6]), np.array([7,8,9]) ]
prd=itertools.product(many_arrays,many_arrays2)
dists=[]
for it in prd:
    dists.append([np.linalg.norm(it[0]-it[1]),it[0],it[1]])
sorted(dists, key=lambda x: x[0])


Результат:
[[0.0, array([1, 2, 3]), array([1, 2, 3])],
[0.0, array([4, 5, 6]), array([4, 5, 6])],
[0.0, array([7, 8, 9]), array([7, 8, 9])],
[5.196152422706632, array([1, 2, 3]), array([4, 5, 6])],
[5.196152422706632, array([4, 5, 6]), array([1, 2, 3])],
[5.196152422706632, array([4, 5, 6]), array([7, 8, 9])],
[5.196152422706632, array([7, 8, 9]), array([4, 5, 6])],
[10.392304845413264, array([1, 2, 3]), array([7, 8, 9])],
[10.392304845413264, array([7, 8, 9]), array([1, 2, 3])]]
Ответ написан
@U235U235
В scipy есть scipy.spatial.distance.pdist¶
По-моему это то, что вам нужно.
Поправлю: cdist, конечно же.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы