如何在Python中找到两个矩阵之间的差异,结果不应该有任何带减号的值

Posted

技术标签:

【中文标题】如何在Python中找到两个矩阵之间的差异,结果不应该有任何带减号的值【英文标题】:How to find the difference between two matrices in Python with the result should not have any values with minus sign 【发布时间】:2018-01-16 22:01:55 【问题描述】:

我有一个 Panda 数据框,里面有两列(Word 和 Word_Position)。我需要找到单词之间的距离并以矩阵形式呈现输出以提高可读性。

到目前为止,我已经从 DF.Word_Position 列创建了一个行矩阵,并将其转置以创建一个列矩阵。当我减去这两个矩阵时,我得到的值很少在它们前面带有减号。

恕我直言,这绝对是正确的,但根据我的要求,我只需要数字而不是减号。

还有其他更好的方法吗?感谢您的帮助。提前致谢。

注意:我使用的是 Python 3.6

代码 sn-ps 及其对应的输出供您参考

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

【问题讨论】:

我可以知道这个问题被否决的原因吗? 【参考方案1】:

只取绝对值?

np.abs(m2 - m1)

您的代码表明您的数据由 numpy 数组组成,因此上述解决方案应该可以工作。

如果它们是数据框,您可以这样做:

m2.sub(m1).abs()

【讨论】:

谢谢@Alexander。这看起来很简单,对像我这样的 python 新手很有帮助【参考方案2】:

在这种情况下,您可能希望使用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)

【讨论】:

我认为您的答案需要一个二维数组作为输入。但我的要求涉及两个一维数组。 是的。 abs 选项按照其他受访者之前的建议发挥作用【参考方案3】:

如果你想要数组之间的距离,正确的方法是计算norm:

dists = [np.linalg.norm(m - m2, axis=1) for m in m1[0]]

这假设数组的形状是(n_sample, n_dimension)

您可以在 m2 上进行 numpy 广播,而不是列表理解


您希望对可能要使用的指标进行更多控制scipy.spatial.distance.cdist。对于大型阵列,此选项更快。一个带有 minkowski 距离的例子(欧几里得距离 p=2):

dists = [scipy.spatial.distance.cdist(m, m2, 'minkowski', p) for m in m1]

当然,如果数组只有一维,你可以使用绝对值来实现:

dists = np.abs(m1 - m2)

【讨论】:

谢谢@Y0da。如果我没记错的话, np.linalg.norm(m1-m2) 或 np.linalg.norm(m2-m1) 只会产生单个值。但我需要的是矩阵形式的输出,其值为每个单词之间的距离 @JKC 尝试使用轴选项:axis=1 或axis=0 对不起@Y0da 即使使用轴选项我也没有得到所需的输出。可能这不适用于我的要求。 Alexander 的回答非常有用且简单。 @JKC 有什么错误?如果您有两个形状正确的数组(见上文)。你试过 cdist 吗? 没有错误。但它没有像我预期的那样给出输出。请参阅下面的答案生成的输出。 np.linalg.norm(m2-m1, axis=1) Out[384]: array([ 53.57238094, 49.70915409, 45.97825573, ..., 45.97825573, 49.70915409, 53.57238094])

以上是关于如何在Python中找到两个矩阵之间的差异,结果不应该有任何带减号的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 odeint 的手动函数和矩阵乘法结果之间的差异

如何计算两个日期之间的差异

如何在python中找到用户的偏好向量和项目描述表(大小不同的矩阵)之间的相似距离?

使用python返回excel中两个不同文件中两列之间的差异

如何找到两个时间之间的差异? [复制]

如何找到两个角度之间的差异?