首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy阵列中两点间赋范距离的计算

numpy阵列中两点间赋范距离的计算
EN

Stack Overflow用户
提问于 2019-12-15 22:23:07
回答 3查看 287关注 0票数 0

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

代码语言:javascript
复制
a = [2, 5, 5, 12, 5, 3, 10, 8, 1, 3, 1]

我希望得到一个方阵,其中每个点之间有(赋范的)距离:

代码语言:javascript
复制
sq = [[0, |2-5|, |2-5|, |2-12|, |2-5|, ...],
        [|5-2|, 0, ...], ...]

到目前为止,我所得到的不起作用,给出了平方距离矩阵的错误值。有没有办法(我不确定它是否是正确的术语?)我的方法也是矢量化的,但我不熟悉高级索引。

我目前的情况如下:

代码语言:javascript
复制
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])

会很感激你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-16 08:23:24

我认为利用地下广播,这是较快的解决办法:

代码语言:javascript
复制
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]])
票数 0
EN

Stack Overflow用户

发布于 2019-12-15 22:53:14

对于numpy,下面的行可能是结果的最短部分:

代码语言:javascript
复制
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。

代码语言:javascript
复制
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, 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]]

票数 0
EN

Stack Overflow用户

发布于 2019-12-15 23:00:13

可能有不止一种方法可以做到这一点,但一种方法是只使用numpy操作而不是循环,因为在内部python为numpy数组做了很多优化。

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

例如:

代码语言:javascript
复制
a = [1, 2, 3]

b = [[1 , 2, 3], [1 , 2, 3], [1 , 2, 3]]

然后,您可以做一个矩阵,数组操作

代码语言:javascript
复制
ans = abs(b - a) 

假设a是numpy数组,您可以这样做:

代码语言:javascript
复制
b = np.repeat(a,a.shape).reshape((a.shape[0],a.shape[0]))

ans = np.abs(b - a)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59348576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档