Quiero calcular una matriz de distancia a partir de datos de un diccionario como los siguientes:
y = {"a": ndarray1, "b": ndarry2, "c": ndarry3}
El valor de cada clave ("a", "b", "c") es un np.ndarry con diferente tamaño. Y tengo un dist()
Función que puede calcular la distancia entre y["a"]
y y["b"]
mediante dist(y["a"], y["b"])
.
Para que la matriz de distancia resultante sea:
+----------------------------------------------------------------+
| a b c |
+----------------------------------------------------------------+
| a | 0 mydist(ndarrya1, ndarray) mydist(ndarray1, ndarray3) |
| b | 0 mydist(ndarray2, ndarray3) |
| c | 0 |
+----------------------------------------------------------------+
Yo he tratado scipy.spatial.distance.pdist
con pdist(y, mydist)
, pero se equivocó al decir que:
[X] = _copy_arrays_if_base_present([_convert_to_double(X)])
File "/usr/local/lib/python2.7/dist-packages/scipy/spatial/distance.py", line 113, in _convert_to_double
X = X.astype(np.double)
TypeError: float() argument must be a string or a number
¿Alguien puede decirme cómo implementar este pdist por mí mismo? Quiero usar el resultado pdist para un mayor agrupamiento jerárquico.
Respuestas
1 para la respuesta № 1La primera parte de tu pregunta es bastante clara. La segunda parte, no sé qué estás preguntando. ¿Por qué necesitas volver a implementar? scipy.spatial.distance.pdist
, Pensé que ya tienes un dist()
Función para calcular la distancia por pares.
Para obtener la distancia de pares, cuando ya tienes un dist()
Función para calcularlo:
In [69]:
D={"a":some_value,"b":some_value,"c":some_value}
In [70]:
import itertools
In [71]:
list(itertools.combinations(D,2))
Out[71]:
[("a", "c"), ("a", "b"), ("c", "b")]
In [72]: #this is what you need:
[dist(*map(D.get, item)) for item in itertools.combinations(D,2)]