gpt4 book ai didi

python argsort 基于多个数组的索引

转载 作者:行者123 更新时间:2023-11-30 23:44:44 27 4
gpt4 key购买 nike

我正在纯Python中寻找一个理想的函数,它类似于numpy.argsort,因为它只返回排序索引的列表,同时保持原始数组不变,但它需要能够对多个数组中包含的数据进行排序数组。

示例:

>>> names = ['xavier', 'bob', 'billy', 'jene', 'samson']
>>> ages = [15, 32, 63, 32, 15]
>>>indexes = sort by ages and then by names
[4, 0, 1, 3, 2]
>>> for i in indexes:
>>> print "Name", names[i]
>>> print "Age", ages[i]

排序函数无法创建额外的数据结构,这意味着列表理解或 zip 等函数是不可能的。每个数组由 500 万个对象组成,生成数组的压缩版本会将内存需求增加至少 3 倍。使用列表理解,例如排序(..key=lambda x:(names[x],ages[x] )) 导致速度减慢,例如排序需要一分钟多才能完成(以及创建这些中间元组的内存要求)

到目前为止,只要我只想对单个数组进行排序,它就足够快了,但是由于索引列表不知道其他数组,所以我无法像我那样调用多个“排序”操作我有两个列表的压缩版本。

最佳答案

这是我能想到的最好的了。 python 中的大多数 int 都是单例的,因此第一次排序调用创建的新列表不应创建更多全新的对象。第二个 sorted 调用应该创建一个较小的列表,这取决于年龄的差异有多大。

>>> import itertools, operator
>>> names = ['xavier', 'bob', 'billy', 'jene', 'samson']
>>> ages = [15, 32, 63, 32, 15]
>>> itemgetter = operator.itemgetter(1)
>>> sortedAges = sorted(enumerate(ages), key=itemgetter)
>>> for k, group in itertools.groupby(sortedAges, itemgetter):
... g = sorted([(i, names[i]) for i, _ in group], key=itemgetter)
... for i, name in g:
... print 'Name:', name, 'Age:', ages[i]
...
Name: samson Age: 15
Name: xavier Age: 15
Name: bob Age: 32
Name: jene Age: 32
Name: billy Age: 63

关于python argsort 基于多个数组的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9968297/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com