我想做一个小小的练习,所以我决定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
,但我仍然得到相同的输出。
答案 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)))