Python 3.x numpy阵列中两点间赋范距离的计算
我希望计算(Nx1)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, ...], ...] 到目前为止,我得到的不起作用,给平方距离矩阵提供了错误的值。是否有一种方法(我不确定它是否是正确的术语?)将我的方法也矢量化,但我不熟悉高级索引 我目前的情况
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]])