用负数排序numpy字符串数组?

时间:2011-10-03 17:53:58

标签: python arrays sorting numpy

我在排序数字为字符串的numpy数组时遇到问题。我需要将它们保存为字符串,因为整数后面还有其他单词。

它按相反的顺序排序负数:

>>> import numpy as np
>>> a = np.array(["3", "-2", "-1", "0", "2"])
>>> a.sort()
>>> a
array(['-1', '-2', '0', '2', '3'], dtype='|S2')

我原本期望输出为:

array(['-2', '-1', '0', '2', '3'], dtype='|S2')

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

您可以使用natural sorting

import numpy as np
import re

def atoi(text):
    try:
        return int(text)
    except ValueError:
        return text

def natural_keys(text):
    '''
    alist.sort(key=natural_keys) sorts in human order
    http://nedbatchelder.com/blog/200712/human_sorting.html
    '''    
    return [ atoi(c) for c in re.split('([-]?\d+)', text) ]

a = np.array(["3", "-2", "-1", "0", "2", "word"])
print(sorted(a,key=natural_keys))
# ['-2', '-1', '0', '2', '3', 'word']

a = np.array(["3", "-2", "-1", "0", "2", "word", "-1 word", "-2 up"])
print(sorted(a,key=natural_keys))
# ['-2', '-2 up', '-1', '-1 word', '0', '2', '3', 'word']

答案 1 :(得分:2)

假设在其他单词之前的整数之后有一个空格,那么如果a是一个regluar python list,你可以这样做:

a.sort(key = lambda s: int(s.split()[0]))

不确定Numpy中的等价物是什么(不知道如何指定键),但有一种可能性是转换为列表并返回数组。