我有一个熊猫数据帧,里面有两列(Word和Word_Position(。我需要找到单词之间的距离并以矩阵形式呈现输出以获得更好的可读性。
到目前为止,我所做的是从DF创建了一个行矩阵。Word_Position列并将其转置以创建列矩阵。当我减去这两个矩阵时,我得到的值很少,前面有减号。
恕我直言,伟大的数学,这是绝对正确的,但对于我的要求,我只需要数字而不是减号。
还有其他更好的方法可以做同样的事情吗?感谢您的帮助。提前谢谢。
注意:我正在使用Python 3.6
代码片段及其相应的输出供您参考
m1 = np.matrix(df1['Word Position'])
print(m1)
[[ 1 2 3 ..., 19 20 21]]
m2 = np.matrix(m1.T)
print(m2)
[[ 1]
[ 2]
[ 3]
...,
[19]
[20]
[21]]
print(m2-m1)
[[ 0 -1 -2 ..., -18 -19 -20]
[ 1 0 -1 ..., -17 -18 -19]
[ 2 1 0 ..., -16 -17 -18]
...,
[ 18 17 16 ..., 0 -1 -2]
[ 19 18 17 ..., 1 0 -1]
[ 20 19 18 ..., 2 1 0]]
只取绝对值?
np.abs(m2 - m1)
您的代码表明您的数据由 numpy 数组组成,因此上面的解决方案应该可以工作。
如果它们是数据帧,则可以执行以下操作:
m2.sub(m1).abs()
在这种情况下,您可能希望使用scipy.spatial.distance.pdist
from scipy.spatial.distance import squareform, pdist
m = df1['Word Position'].data[:, None]
dist = squareform(pdist(m, 'minkowksi', 1))
这有点矫枉过正,但如果你想改变你的距离参数,它是可扩展的,而且通常比广播快(因为它只做一半的减法步长作为abs(a-b) == abs(b-a)
(。 如果你想做广播,你可以总是这样做:
dist = np.abs(m - m.T)
如果你想要数组之间的距离,正确的方法是计算范数:
dists = [np.linalg.norm(m - m2, axis=1) for m in m1[0]]
这假设数组的形状是
(n_sample, n_dimension)
。代替列表理解,您可以在 m2 上进行 numpy 广播
如果你想对你可能想要使用scipy.spatial.distance.cdist的指标进行更多控制。对于大型数组,此选项速度更快。以闵可夫斯基距离为例(欧几里得距离的p=2(:
dists = [scipy.spatial.distance.cdist(m, m2, 'minkowski', p) for m in m1]
当然,如果数组只有 1D,您可以使用绝对值来实现:
dists = np.abs(m1 - m2)