【问题标题】:Sort numpy string array with negative numbers?用负数对numpy字符串数组进行排序?
【发布时间】:2011-11-30 02:59:32
【问题描述】:

我在对包含数字作为字符串的 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')

有什么建议吗?

【问题讨论】:

  • 所以你在一个字符串中保存了两种类型的数据?似乎不太适合numpy
  • “我需要将这些保留为字符串,因为整数后面还有其他单词”。所以你有一个像"76 trombones" 这样的字符串,你想把它当作数字76 后跟单词"trombones"然后这样做。解析字符串并创建 (number, rest of string) 的 2 元组。
  • 不,它不乖。有时它是一个数字和字符串,有时它只是一个字符串。 “自然排序”方法有效。

标签: python arrays sorting numpy


【解决方案1】:

你可以使用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 word", "-2 up"],将会得到错误的顺序,这就是我认为OP 的“整数之后的其他词”的意思。
  • 我在数组包含["-1 word", "-2 up"] 时发布了输出。我认为顺序是正确的,不是吗?
  • 你是对的。我误读了你的正则表达式。对我来说看起来不错,这取决于您要如何处理字符串开头没有出现整数的情况! (我的引发了 ValueError。)
【解决方案2】:

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

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

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

【讨论】:

  • 您的版本适用于sorted(a, key = lambda s: int(s.split()[0]))。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多