用字典数据计算距离矩阵的Python

1 投票
1 回答
1175 浏览
提问于 2025-04-17 20:33

我想从一个字典数据中计算出一个距离矩阵,字典的数据格式如下:

y = {"a": ndarray1, "b": ndarry2, "c": ndarry3}

在这个字典里,每个键(比如 "a"、"b"、"c")对应的值是一个大小不同的 np.ndarray(就是一种数组)。我有一个叫 dist() 的函数,可以用来计算 y["a"]y["b"] 之间的距离,方法是通过 dist(y["a"], y["b"])

所以我想得到的距离矩阵应该是这样的:

+----------------------------------------------------------------+
|                a        b                        c             |
+----------------------------------------------------------------+
| a  | 0        mydist(ndarrya1, ndarray)  mydist(ndarray1, ndarray3) |
| b  |          0                        mydist(ndarray2, ndarray3) |
| c  |                                   0                        |
+----------------------------------------------------------------+

我试过用 scipy.spatial.distance.pdist 来计算,代码是 pdist(y, mydist),但出现了一个错误,提示信息是:

[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

有没有人能告诉我怎么自己实现这个 pdist?我想用 pdist 的结果来进行后续的层次聚类。

1 个回答

1

你问题的第一部分很清楚。至于第二部分,我不太明白你在问什么。你为什么需要重新实现 scipy.spatial.distance.pdist 呢?我以为你已经有一个 dist() 函数可以计算成对的距离了。

如果你已经有一个 dist() 函数来计算成对的距离,那么你可以这样做:

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)]

撰写回答