【问题标题】:sorting np array vs python list yields different results排序 np 数组与 python 列表会产生不同的结果
【发布时间】:2018-01-23 03:15:42
【问题描述】:

我想做一点 numpy 的练习,所以我决定borrow some quicksort code 并把它改成使用 numpy。

这是原文:

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]

    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]

    return quicksort(left) + middle + quicksort(right)

print (quicksort([1,2,32,121,4,5,51]))

在这里我将其更改为使用 numpy 数组

def quicksort_np(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]

    left = arr[arr < pivot]
    middle = arr[arr == pivot]
    right = arr[arr > pivot]

    return quicksort_np(left) + middle + quicksort_np(right)

print (quicksort_np(np.array([1,2,32,121,4,5,51])))

运行原始版本,我得到正确的输出:

[1, 2, 4, 5, 32, 51, 121]

但是,运行 numpy 版本时,我得到一个 空列表

[]

我不明白问题出在哪里。我认为这与新列表不是副本有关,所以我尝试在 quicksort_np 内的每个列表上调用 .copy(),但仍然得到相同的输出。

【问题讨论】:

  • 将列表代码移植到numpy 不是学习numpy 的好方法。表面上的相似性可能会导致这样的错误,并且还会促进糟糕的numpy 风格。

标签: python arrays sorting numpy


【解决方案1】:

我认为错误在你的行中:

return quicksort_np(left) + middle + quicksort_np(right)

'+' 运算符是用于 python 列表的连接运算符,但用于 numpy 数组的 sum 运算符。

你可以通过np.concatenate来解决这个问题

【讨论】:

  • 非常感谢。我想我必须小心我认为在 python 和 numpy 中常见的东西
【解决方案2】:

+ 运算符适用于 python 列表,但不适用于 numpy 数组。

改用np.hstack

def quicksort_np(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]

    left = arr[arr < pivot]
    middle = arr[arr == pivot]
    right = arr[arr > pivot]

    return np.hstack((quicksort_np(left), middle, quicksort_np(right)))

【讨论】:

    猜你喜欢
    • 2014-05-13
    • 2023-03-30
    • 2020-02-09
    • 1970-01-01
    • 2019-10-11
    • 2015-03-16
    • 1970-01-01
    • 2010-09-11
    • 2013-09-05
    相关资源
    最近更新 更多