优化给定偏移的数组距离的成对计算
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
您可以使用 delta
对 a
进行切片,然后减去两个子数组:
>>> a = np.array([1,5,7,7,2,6])
>>> delta = 2
>>> a[delta:] - a[:-delta]
array([ 6, 2, -5, -1])
这种切片操作对于大型数组来说可能非常快,因为不需要在 a
中创建额外的索引或数据副本。减法创建一个包含所需值的新数组。
我有一个包含数百万个条目的数组。 我想为成对的条目计算另一个向量,其中包含所有距离,这些条目在数组中移动了某个数字增量。
实际上我正在使用这个:
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
您可以使用 delta
对 a
进行切片,然后减去两个子数组:
>>> a = np.array([1,5,7,7,2,6])
>>> delta = 2
>>> a[delta:] - a[:-delta]
array([ 6, 2, -5, -1])
这种切片操作对于大型数组来说可能非常快,因为不需要在 a
中创建额外的索引或数据副本。减法创建一个包含所需值的新数组。