2015-01-13 29 views
1

我有一个包含数百万条目的数组。 我想计算另一个矢量,它包含所有的距离,对于在数组中偏移了特定数量增量的条目对。优化成对给定移位数组的距离的成对计算

其实我使用这个:

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

你的Python版本是什么? – Kasramvd

+0

它是Python 2.7.3 – Cukhen

+0

看到一个输入和你的预期输出的例子将是有用的 - 你能发布一个小例子吗? –

回答

2

a使用delta,然后减去两个子阵列,您可以只切:

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

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

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