我想按照元素的长度使用numpy对字符串数组进行排序。
>>> arr = ["year","month","eye","i","stream","key","house"]
>>> x = np.sort(arr, axis=-1, kind='mergesort')
>>> print(x)
['eye' 'house' 'i' 'key' 'month' 'stream' 'year']
但它按照字母数字顺序对它们进行排序。如何根据长度使用numpy对它们进行排序?
答案 0 :(得分:3)
添加一个包含字符串长度的辅助数组,然后使用numpy的argsort,它会为您提供根据这些长度排序的索引。使用以下索引索引原始数据:
import numpy as np
arr = np.array(["year","month","eye","i","stream","key","house"]) # np-array needed for later indexing
arr_ = map(lambda x: len(x), arr) # remark: py3 would work different here
x = arr[np.argsort(arr_)]
print(x)
答案 1 :(得分:1)
如果我将列表扩展为arr1=arr*1000
,那么使用len
作为key
函数的Python列表排序最快。
In [77]: len(arr1)
Out[77]: 7000
In [78]: timeit sarr=sorted(arr1,key=len)
100 loops, best of 3: 3.03 ms per loop
In [79]: %%timeit
arrA=np.array(arr1)
larr=[len(i) for i in arrA] # list comprehension works same as map
sarr=arrA[np.argsort(larr)]
....:
100 loops, best of 3: 7.77 ms per loop
将列表转换为数组大约需要1毫秒(该转换会增加大量开销,尤其是对于小型列表)。使用已创建的数组和np.char.str_len
时间仍然比Python sort
慢。
In [83]: timeit sarr=arrA[np.argsort(np.char.str_len(arrA))]
100 loops, best of 3: 6.51 ms per loop
np.char
函数可以很方便,它们仍然基本上遍历列表,应用相应的str
方法。
通常argsort
为您提供与key
功能相同的功能。