在python中计算向量中所有项目组合之间的差值

2024-10-05 11:24:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个z值的numpy1d数组,我想计算所有项目组合之间的差异,输出为一个方阵。你知道吗

我知道如何使用cdist计算所有点组合之间的距离,但这并没有给出符号:

例如,如果我的z向量是[1,5,8]

import numpy as np
from scipy.spatial.distance import cdist

z=np.array([1, 5, 8])
z2=np.column_stack((z,np.zeros(3)))
cdist(z2,z2)

给了我:

array([[0., 4., 7.],
       [4., 0., 3.],
       [7., 3., 0.]])

但我想有迹象告诉我:

array([[0., 4., 7.],
       [-4., 0., 3.],
       [-7., -3., 0.]])

我想用np.trilèu指数翻转下三角形的符号,但这不起作用,因为我需要以一致的方式对两个向量进行差分(即,如果对两个或多个向量执行此操作,则总是以相同的顺序对两个向量进行比较),而通过翻转符号,我总是在右上角有正的差异,在左下角有负的差异。你知道吗


Tags: 项目importnumpy距离np符号数组差异
3条回答

我已经计算出我可以用双迭代器得到我想要的答案,尽管我不确定它对于非常大的数组是最有效的

np.array([j-i for i in z for j in z]).reshape(len(z),len(z))

输出:

array([[ 0,  4,  7],
   [-4,  0,  3],
   [-7, -3,  0]])

编辑:实际上,其他两种解决方案的速度要快50倍:

python3 -m timeit -s "import numpy as np" -s "z=np.random.uniform(size=5000)" "z-z.reshape(-1,1)"
2 loops, best of 5: 119 msec per loop

python3 -m timeit -s "import numpy as np" -s "z=np.random.uniform(size=5000)" "np.subtract.outer(z, z)"
2 loops, best of 5: 118 msec per loop

python3 -m timeit -s "import numpy as np" -s "z=np.random.uniform(size=5000)" "np.array([j-i for i in z for j in z]).reshape(len(z),len(z))"
1 loop, best of 5: 5.18 sec per loop

使用numpy阵列广播的简单单线解决方案。你知道吗

import numpy as np

z = np.array([1, 5, 8])
# Simple one line solution
z - z.reshape(-1,1)

输出

array([[ 0,  4,  7],
       [-4,  0,  3],
       [-7, -3,  0]])
In [29]: z = np.array([1, 5, 8])                                                                                                                                                                     

In [30]: -np.subtract.outer(z, z)                                                                                                                                                                    
Out[30]: 
array([[ 0,  4,  7],
       [-4,  0,  3],
       [-7, -3,  0]])

(如果你不在乎符号惯例,就去掉减号。)

相关问题 更多 >

    热门问题