加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 11:54:54 所属栏目:Python 来源:网络整理
导读:我有两个数组作为模拟脚本的输出,其中一个包含ID和一次,例如: ids = np.array([2,1,2])times = np.array([.1,.3,.5,.6,1.2,1.3]) 这些数组总是大小相同.现在我需要计算时间的差异,但仅适用于具有相同ID的那些时间.当然,我可以简单地遍历不同的ID for id in
我有两个数组作为模拟脚本的输出,其中一个包含ID和一次,例如:

ids = np.array([2,1,2])
times = np.array([.1,.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’)选项.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读