如何在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中找到两个矩阵之间的差异,结果不应该有任何带减号的值的主要内容,如果未能解决你的问题,请参考以下文章
如何在python中找到用户的偏好向量和项目描述表(大小不同的矩阵)之间的相似距离?