我正在尝试计算距离矩阵,但是要根据向量计算,因此我想返回一个距离矩阵,其中(i, j)
是两个向量之间的距离,例如在a
和b
之间。因此,在这种情况下,我希望创建一个4x4矩阵,该矩阵在每个位置都包含一个向量。这是我的示例数组,每个数组都包含一个带有多个点的向量。
a = [a1, a2, a3]
b = [b1, b2, b3]
c = [c1, c2, c3]
我尝试使用scipy.spatial.distance.pdist
和squareform
(这只是给我一个完整的矩阵,而不是压缩矩阵),但是它返回的是单个值而不是向量。
所以像这样的矩阵,
[ 0 1 2
1 0 2
2 3 0 ]
取而代之的是,每个i, j
位置是两个向量之间的距离,因此按照示例包含5个点。
[ [a1/a1, a2/a2, a3/a3 ] [a1/b1, a2/b2, a3/b3] [a1/c1, a2/c2, a3/c3]
[b1/a1, b2/a2, b3/a3] [b1/b1, b2/b2, b3/b3] [b1/c1, b2/c2, b3/c3]
[c1/a1, c2/a2, c3/a3] [c1/b1, c2/b2, c3/b3] [c1/c1, c2/c2, c3/c3]]
我想分别计算数组中每个值的距离,所以我不希望计算a1,a2,a3对b1,b2,b3的Eucladian距离,而只是对a1对b1进行计算,依此类推。我想返回一个向量,该向量包括在数组a和b的所有值之间计算出的距离,并将其定位在(a,b)处。通过“ /”,我想显示应该计算出两个值之间的距离。
答案 0 :(得分:0)
据我了解,您要的是每个元素的距离(绝对值?),这样两个列表之间的“距离”也是一个列表。 这是我的小例子
vec = [[1, 2, 3], #a
[4, 5, 6], #b
[7, 8, 9]] #c
#oneliner
mat = [[[abs(vec[i][k] - vec[j][k] for k in len(vec[i]))]
for j in len(vec)]
for i in len(vec)]
输出:
mat
[[[0, 0, 0], [3, 3, 3], [6, 6, 6]],
[[3, 3, 3], [0, 0, 0], [3, 3, 3]],
[[6, 6, 6], [3, 3, 3], [0, 0, 0]]]
并且由于结果是对称的,因此我们只能计算矩阵的前半部分:
mat = [[[abs(vec[i][k] - vec[j][k]) for k in range(len(vec[i]))]
if i<j else []
for j in range(len(vec))]
for i in range(len(vec))]
将输出如下内容:
mat
[[[], [3, 3, 3], [6, 6, 6]],
[[], [], [3, 3, 3]],
[[], [], []]]