使用numpy对字符串数组排序

2024-06-16 11:00:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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按长度对它们进行排序?在


Tags: key字符串numpy元素stream排序np数组
2条回答

添加一个包含字符串长度的helper数组,然后使用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)

如果我将列表扩展到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时间仍然比Pythonsort慢。在

^{pr2}$

np.char函数可能很方便,它们仍然基本上迭代列表,应用相应的str方法。在

一般来说,argsort提供了与key函数相同的功能。在

相关问题 更多 >