使用numpy对字符串数组进行排序

时间:2016-06-16 11:55:16

标签: python sorting numpy

我想按照元素的长度使用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对它们进行排序?

2 个答案:

答案 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功能相同的功能。