计算numpy数组的平方距离

时间:2013-06-30 13:53:27

标签: python numpy

我脑力不集中,但我无法让它发挥作用。我有一系列距离:

import numpy as np
zvals = np.linspace(-5,5,10)
d = np.array([(0,0,z) for z in zvals])

我想计算数组中点的平方距离。实现这项工作的非笨拙方式是:

d2 = np.array([np.dot(d[i,:],d[i,:]) for i in range(d.shape[0])])

然而,我知道只需要一次调用dot,就必须有一些方法可以做到这一点,对吗?话虽如此,

d2 = np.dot(d,d.T)

d2 = np.dot(d.T,d)

给我想要的东西。我意识到,我是傻瓜,但请在这里赐教。谢谢!

3 个答案:

答案 0 :(得分:7)

编辑:从NumPy 1.9开始,看起来inner1d可能会更快。 (感谢Nuno Aniceto指出这一点):

In [9]:  %timeit -n 1000000 inner1d(d,d)
1000000 loops, best of 3: 1.39 µs per loop

In [14]: %timeit -n 1000000 einsum('ij,ij -> i', d, d)
1000000 loops, best of 3: 1.8 µs per loop

PS。始终在类似于您的预期用例的输入上测试您自己的基准。结果可能因各种原因而有所不同,例如输入大小,硬件,操作系统,Python版本,NumPy版本,编译器和库(例如ATLAS,MKL,BLAS)。


如果你有NumPy 1.6或更高版本,你可以使用np.einsum

In [40]: %timeit np.einsum('ij,ij -> i', d, d)
1000000 loops, best of 3: 1.79 us per loop

In [46]: from numpy.core.umath_tests import inner1d

In [48]: %timeit inner1d(d, d)
100000 loops, best of 3: 1.97 us per loop

In [44]: %timeit np.sum(d*d, axis=1)
100000 loops, best of 3: 5.39 us per loop

In [41]: %timeit np.diag(np.dot(d,d.T)) 
100000 loops, best of 3: 7.2 us per loop

In [42]: %timeit np.array([np.dot(d[i,:],d[i,:]) for i in range(d.shape[0])])
10000 loops, best of 3: 26.1 us per loop

答案 1 :(得分:4)

点数产品功能非常快,对于非常简单的东西甚至可能击败np.einsum(这是一个非常棒的功能,你一定要学习使用)。 Numpy有一个隐藏的小宝石inner1d,它通过广播在其参数的最后一个维度上做点积。您可以按如下方式使用它:

from numpy.core.umath_tests import inner1d
inner1d(a, a)

答案 2 :(得分:1)

我不确定是否有一种巧妙的方法将普通的点积方法插入更大的数组中。相反,我通常会这样做:

d2 = n.sum(d*d,axis=1)

d * d当然是标准点积运算,因为它只是数组中所有条目的元素乘法。 axis=1参数沿第二个轴求和(水平,当打印数组时),这是点积运算的第二部分。

编辑:此外,忽略方法的一般不受欢迎程度,您的行

d2 = np.array([np.dot(d[i,:],d[i,:]) for i in range(d.shape[0])])

可以简单地

d2 = np.array([np.dot(row,row) for row in d])

当使用'for in array'语法时,numpy数组返回行而不是单个矩阵条目。