优化给定偏移的数组距离的成对计算

Optimizing pairwise calculation of distances an array for a given shift

我有一个包含数百万个条目的数组。 我想为成对的条目计算另一个向量,其中包含所有距离,这些条目在数组中移动了某个数字增量。

实际上我正在使用这个:

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.])

假设 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

您可以使用 deltaa 进行切片,然后减去两个子数组:

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

这种切片操作对于大型数组来说可能非常快,因为不需要在 a 中创建额外的索引或数据副本。减法创建一个包含所需值的新数组。