排序np数组与python列表会产生不同的结果

时间:2018-01-23 03:15:42

标签: python arrays sorting 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版本,我得到一个空列表

[]

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

2 个答案:

答案 0 :(得分:2)

我认为错误在您的行中:

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

&#39; +&#39; operator是python列表的连接运算符,但是numpy数组的sum运算符。

您可以使用np.concatenate

解决问题

答案 1 :(得分: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)))