【问题标题】:Getting strange results from numpy argsort从 numpy argsort 得到奇怪的结果
【发布时间】:2019-02-13 00:12:34
【问题描述】:

我有(在我看来)一个相当清晰的例子,它使用 numpy argsort 产生奇怪的结果。如果我创建一个示例字符数组:

letters = np.array([['b','a','c'],
                    ['c','a','b'],
                    ['b','c','a']]).astype(str)

然后我希望沿行进行排序(并保留排序顺序,以供以后使用)。我从 argsort 得到的输出是

sort_seq = np.argsort(letters, axis=1)
sort_seq
array([[1, 0, 2],
       [1, 2, 0],
       [2, 0, 1]])

这似乎使第一行正确,但其他人则不然。如果我用它来重建数组,那么我得到:

output = np.full_like(letters, '')
np.put_along_axis(output, sort_seq, letters,axis=1)
output

给了

array([['a', 'b', 'c'],
       ['b', 'c', 'a'],
       ['c', 'a', 'b']], dtype='<U1')

如果我查看这里和其他站点,我会发现多维数组的 argsorting 有时并不总是很好。但是这个例子似乎非常接近 numpy 文档中给出的例子——在这种情况下它肯定可以工作吗?

感谢您的帮助!

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    我觉得不错:

    In [88]: letters = np.array([['b','a','c'],
        ...:                     ['c','a','b'],
        ...:                     ['b','c','a']]).astype(str)
        ...: sort_seq = np.argsort(letters, axis=1)
        ...:                     
    In [89]: np.take_along_axis(letters, sort_seq, axis=1)
    Out[89]: 
    array([['a', 'b', 'c'],
           ['a', 'b', 'c'],
           ['a', 'b', 'c']], dtype='<U1')
    

    这可能是我们如何理解argsort 的问题。是“接受”订单还是“卖出”订单?

    要使用put,我们必须使用双重排序

    In [91]: dblsort= np.argsort(sort_seq, axis=1)
    In [92]: dblsort
    Out[92]: 
    array([[1, 0, 2],
           [2, 0, 1],
           [1, 2, 0]])
    In [93]: res = np.zeros_like(letters)
    In [94]: np.put_along_axis(res, dblsort, letters, axis=1)
    In [95]: res
    Out[95]: 
    array([['a', 'b', 'c'],
           ['a', 'b', 'c'],
           ['a', 'b', 'c']], dtype='<U1')
    

    numpy: find index in sorted array (in an efficient way)

    【讨论】:

    • 谢谢 - 我怀疑这可能是我不知道自己在做什么的情况,而不是 numpy 本身的明显缺陷。我将掌握 put_along_axis 与 take_along_axis。感谢您帮助解决这个迫在眉睫的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-08-21
    • 2022-01-25
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多