python – 计算数组中所选差异的有效方法

我有两个数组作为模拟脚本的输出,其中一个包含ID和一次,例如:

ids = np.array([2, 0, 1, 0, 1, 1, 2])
times = np.array([.1, .3, .3, .5, .6, 1.2, 1.3])

这些数组总是大小相同.现在我需要计算时间的差异,但仅适用于具有相同ID的那些时间.当然,我可以简单地遍历不同的ID

for id in np.unique(ids):
    diffs = np.diff(times[ids==id])
    print diffs
    # do stuff with diffs

然而,这是非常低效的,并且两个阵列可能非常大.有没有人对如何更有效地做到这一点有一个好主意?

最佳答案 您可以使用array.argsort()并忽略与ids中的更改相对应的值:

>>> id_ind = ids.argsort(kind='mergesort')
>>> times_diffs = np.diff(times[id_ind])
array([ 0.2, -0.2,  0.3,  0.6, -1.1,  1.2])

要查看需要丢弃的值,可以使用计数器计算每个id的次数(来自集合导入计数器)

或者只是排序id,并查看其diff非零的位置:这些是id更改的索引,以及时间差异无关紧要的位置:

times_diffs[np.diff(ids[id_ind]) == 0] # ids[id_ind] being the sorted indices sequence

最后你可以用np.split和np.where拆分这个数组:

np.split(times_diffs, np.where(np.diff(ids[id_ind]) != 0)[0])

正如您在评论中提到的,argsort()默认算法(quicksort)可能不会保持等于时间之间的顺序,因此必须使用argsort(kind =’mergesort’)选项.

点赞