2016-08-17 3 views
0

мой вопрос об использовании функции pdist scipy.spatial.distance. Хотя мне приходится вычислять расстояния от помех между вектором 1x64 с каждым из других миллионов векторов 1x64, которые хранятся в 2D-массиве, я не могу сделать это с помощью pdist. Потому что он возвращает hamming расстояния между любыми двумя векторами внутри одного и того же 2D-массива. Интересно, есть ли какой-либо способ заставить его рассчитать расстояние между конкретным вектором индекса и всеми остальными.Существует ли конкретное использование функции pdist scipy для некоторых определенных индексов?

Вот мой текущий код, теперь я использую 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. вектором и всеми остальными. Что мне делать?

ответ

0

Вы можете использовать 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). В результате получается 2D-массив с одной строкой. Вы можете сразу же вытащить эту строку, так что результат 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] так, что вход является 2D массив (только с одной строки):

In [106]: x[index:index+1] 
Out[106]: array([[1, 0, 1, 1, 0, 1, 1, 0]]) 

Вы получите сообщение об ошибке, если используете x[index].

+0

Да, я узнал, что cdist очень полезен для того, что я делаю. Спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^