针对给定班次优化成对距离的数组计算

时间:2015-01-13 13:54:23

标签: python arrays performance python-2.7 numpy

我有一个包含数百万条目的数组。 我想计算另一个向量,包含条目对的所有距离,它们在数组中移动了一定数量的delta。

实际上我正在使用它:

for i in range(0, len(a) - delta):
    difs = numpy.append(difs, a[i + self.delta] - a[i])

有谁知道如何更快地完成这项工作?

这里有一个类似的问题: Fastest pairwise distance metric in python

但我不想计算每对的距离。

示例:

>>> a = [1,5,7,7,2,6]
>>> delta = 2
>>> print difs
array([ 6.,  2., -5., -1.])

2 个答案:

答案 0 :(得分:2)

您可以使用adelta进行切片,然后减去两个子阵列:

>>> a = np.array([1,5,7,7,2,6])
>>> delta = 2
>>> a[delta:] - a[:-delta]
array([ 6,  2, -5, -1])

对于大型数组,此切片操作可能非常快,因为不需要创建a中的其他索引或数据副本。减法创建一个具有所需值的新数组。

答案 1 :(得分:0)

假设a是一个numpy.array,那么一次索引所有对可能会得到相同的结果。这是一个矢量化的numpy解决方案。

a = numpy.atleast_1d(a)  #// make sure a is a numpy array
idx_minuend = range(delta, len(a))
idx_subtrahend = range(0, len(a)-delta)
difs = a[idx_minuend] - a[idx_subtrahend]

一些小测试验证结果是否相同:

# // a little test with your data
import numpy
a = [1,5,7,7,2,6]
delta = 2

# // current version
difs = numpy.array([])
for i in range(0, len(a) - delta):
    difs = numpy.append(difs, a[i + delta] - a[i])

# // numpy vectorized version
a = numpy.atleast_1d(a)  #// make sure a is a numpy array
idx_minuend = range(delta, len(a))
idx_subtrahend = range(0, len(a)-delta)
difs2 = a[idx_minuend] - a[idx_subtrahend]

# // compare results
(difs == difs2).all()  # True