我有一个包含数百万条目的数组。 我想计算另一个向量,包含条目对的所有距离,它们在数组中移动了一定数量的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.])
答案 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
中的其他索引或数据副本。减法创建一个具有所需值的新数组。
答案 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