Python 3.x numpy阵列中两点间赋范距离的计算

Python 3.x numpy阵列中两点间赋范距离的计算,python-3.x,numpy,Python 3.x,Numpy,我希望计算(Nx1)numpy阵列中两点之间的距离,即: a = [2, 5, 5, 12, 5, 3, 10, 8, 1, 3, 1] 我希望得到一个方阵,每个点之间的距离(标准化): sq = [[0, |2-5|, |2-5|, |2-12|, |2-5|, ...], [|5-2|, 0, ...], ...] 到目前为止,我得到的不起作用,给平方距离矩阵提供了错误的值。是否有一种方法(我不确定它是否是正确的术语?)将我的方法也矢量化,但我不熟悉高级索引 我目前的情况

我希望计算(Nx1)numpy阵列中两点之间的距离,即:

a = [2, 5, 5, 12, 5, 3, 10, 8, 1, 3, 1]
我希望得到一个方阵,每个点之间的距离(标准化):

sq = [[0, |2-5|, |2-5|, |2-12|, |2-5|, ...],
        [|5-2|, 0, ...], ...]
到目前为止,我得到的不起作用,给平方距离矩阵提供了错误的值。是否有一种方法(我不确定它是否是正确的术语?)将我的方法也矢量化,但我不熟悉高级索引

我目前的情况如下:

sq = np.zero((len(a), len(a))

for i in a:
    for j in len(a+1):
        sq[i,j] = np.abs(a[:,0] - a[:,0])

非常感谢您的帮助

使用numpy时,以下行可能最短:

import numpy as np
a = np.array([2, 5, 5, 12, 5, 3, 10, 8, 1, 3, 1])
sq = np.array([np.array([(np.abs(i - j)) for j in a]) for i in a])
print(sq)
以下内容将在不使用numpy的情况下为您提供所需的结果

a = [2, 5, 5, 12, 5, 3, 10, 8, 1, 3, 1]
sq = []
for i in a:
    distances = []
    for j in a:
        distances.append(abs(i-j))
    sq.append(distances)
print(sq)
两者的结果如下:


[代码><码><代码>[0 0、3、3、3、10、10、3、3、3、3、3、10、10、10、3、3、3、3、3、10、10、3、10、3、10、3、3、10、3、3、3、3、3、3、3、3、3、0、0、0、7、0、0、0、0、2、5、5、5、3、3、3、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、0、0、0、0、0、0、0、0、0、0、0、0、0、0[4,4,11,4,2,9,7,0,2,0],[1,2,2,9,2,0,7,5,2,0,2],[1,4,4,11,4,2,2,9,7,0,2,0]实现这一点的方法可能不止一种,但其中一种方法是只使用numpy操作而不是循环,因为python内部对numpy数组进行了大量优化

仅使用数组操作的一种方法是通过将原始矩阵(a)重复N次来创建NxN矩阵。 这将创建一个矩阵N次

例如:

然后你可以做一个矩阵,数组的运算

ans = abs(b - a) 
假设
a
是numpy数组,则可以执行以下操作:

b = np.repeat(a,a.shape).reshape((a.shape[0],a.shape[0]))

ans = np.abs(b - a)

我认为通过利用numpy广播,这是更快的解决方案:

a = [2, 5, 5, 12, 5, 3, 10, 8, 1, 3, 1]
a = np.array(a).reshape(-1,1)
sq = np.abs(a.T-a) 

sq 
array([[ 0,  3,  3, 10,  3,  1,  8,  6,  1,  1,  1],
       [ 3,  0,  0,  7,  0,  2,  5,  3,  4,  2,  4],
       [ 3,  0,  0,  7,  0,  2,  5,  3,  4,  2,  4],
       [10,  7,  7,  0,  7,  9,  2,  4, 11,  9, 11],
       [ 3,  0,  0,  7,  0,  2,  5,  3,  4,  2,  4],
       [ 1,  2,  2,  9,  2,  0,  7,  5,  2,  0,  2],
       [ 8,  5,  5,  2,  5,  7,  0,  2,  9,  7,  9],
       [ 6,  3,  3,  4,  3,  5,  2,  0,  7,  5,  7],
       [ 1,  4,  4, 11,  4,  2,  9,  7,  0,  2,  0],
       [ 1,  2,  2,  9,  2,  0,  7,  5,  2,  0,  2],
       [ 1,  4,  4, 11,  4,  2,  9,  7,  0,  2,  0]])

这回答了你的问题吗?
a = [2, 5, 5, 12, 5, 3, 10, 8, 1, 3, 1]
a = np.array(a).reshape(-1,1)
sq = np.abs(a.T-a) 

sq 
array([[ 0,  3,  3, 10,  3,  1,  8,  6,  1,  1,  1],
       [ 3,  0,  0,  7,  0,  2,  5,  3,  4,  2,  4],
       [ 3,  0,  0,  7,  0,  2,  5,  3,  4,  2,  4],
       [10,  7,  7,  0,  7,  9,  2,  4, 11,  9, 11],
       [ 3,  0,  0,  7,  0,  2,  5,  3,  4,  2,  4],
       [ 1,  2,  2,  9,  2,  0,  7,  5,  2,  0,  2],
       [ 8,  5,  5,  2,  5,  7,  0,  2,  9,  7,  9],
       [ 6,  3,  3,  4,  3,  5,  2,  0,  7,  5,  7],
       [ 1,  4,  4, 11,  4,  2,  9,  7,  0,  2,  0],
       [ 1,  2,  2,  9,  2,  0,  7,  5,  2,  0,  2],
       [ 1,  4,  4, 11,  4,  2,  9,  7,  0,  2,  0]])