Есть ли конкретное использование функции scdy для pdist для некоторых конкретных индексов?
Мой вопрос об использовании pdist-функции scipy.spatial.distance. Хотя мне приходится вычислять расстояния Хэмминга между вектором 1x64 и каждым из других миллионов векторов 1x64, которые хранятся в 2D-массиве, я не могу сделать это с помощью pdist. Потому что он возвращает расстояния Хэмминга между любыми двумя векторами внутри одного и того же 2D-массива. Интересно, есть ли способ заставить его вычислять расстояния Хэмминга между вектором определенного индекса и каждым другим.
Вот мой текущий код, сейчас я использую 1000x64, потому что ошибка памяти появляется с большими массивами.
import numpy as np
from scipy.spatial.distance import pdist
ph = np.load('little.npy')
print pdist(ph, 'hamming').shape
и вывод
(499500,)
little.npy имеет массив 1000x64. Например, если я хочу видеть только расстояния Хэмминга с 31. вектором и все остальные. Что я должен делать?
1 ответ
Ты можешь использовать cdist
, Например,
In [101]: from scipy.spatial.distance import cdist
In [102]: x
Out[102]:
array([[0, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 1, 0],
[0, 0, 0, 1, 1, 1, 0, 0],
[1, 0, 1, 1, 0, 1, 1, 0],
[1, 0, 1, 1, 0, 1, 1, 1],
[0, 1, 0, 1, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 1, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 0, 0, 1, 1, 1, 0],
[1, 0, 0, 1, 1, 0, 0, 1]])
In [103]: index = 3
In [104]: cdist(x[index:index+1], x, 'hamming')
Out[104]:
array([[ 0.625, 0.375, 0.5 , 0. , 0.125, 0.75 , 0.375, 0.375,
0.5 , 0.625]])
Это дает расстояние Хэмминга между строкой в индексе 3 и всеми другими строками (включая строку в индексе 3). В результате получается двумерный массив с одной строкой. Вы можете сразу же извлечь эту строку, чтобы получить результат 1D:
In [105]: cdist(x[index:index+1], x, 'hamming')[0]
Out[105]:
array([ 0.625, 0.375, 0.5 , 0. , 0.125, 0.75 , 0.375, 0.375,
0.5 , 0.625])
я использовал x[index:index+1]
вместо просто x[index]
так что вход является двумерным массивом (с одной строкой):
In [106]: x[index:index+1]
Out[106]: array([[1, 0, 1, 1, 0, 1, 1, 0]])
Вы получите ошибку, если вы используете x[index]
,