在追加到新数组后从数组中删除最小值

时间:2018-10-12 01:21:14

标签: python arrays python-3.x numpy

我正在Python中运行一个选择排序函数,该函数可用于numpy数组而不是列表(因此,我认为我不能使用.pop。)

函数是:

def selectionSort(arr):
    newArr = []
    for i in range(len(arr)):
        smallest = findSmallest(arr) 
        newArr.append((smallest)) 
        arr = arr[(arr > smallest)]
    return newArr

我希望“ arr = arr [(arr> smallest)]显然不起作用,以相同的方式从传递的数组中删除最小值(或附加到newArr的值,即相同的值)该.pop可以处理列表。

我已经尝试过以下方法:

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
index = [2, 3, 6]

new_a = np.delete(a, index)

但是无法正常工作。归根结底,我需要获取以下格式的内容:

arr = randint(0,10,20)

返回以升序排序的数组。我所能管理的就是重复返回最小值。

感谢您的帮助

3 个答案:

答案 0 :(得分:0)

尝试

while (want.click == false)

答案 1 :(得分:0)

您可以尝试:

arr = arr[ arr != np.min(a)]

这样,您将从arr中提取除最小元素之外的所有元素,然后将它们重新分配给arr

答案 2 :(得分:0)

您的算法几乎是正确的。的确,如果arr中没有重复的值,它将起作用:

import numpy as np

def selectionSort(arr):
    newArr = []
    for i in range(len(arr)):
        smallest = findSmallest(arr) 
        newArr.append((smallest)) 
        arr = arr[(arr > smallest)]
    return newArr

findSmallest = np.min

# no duplicate values
auniq = np.random.choice(np.arange(20), (10,), replace=False)

print(auniq)
print(selectionSort(auniq))

样品运行:

[ 0  1  7  4 10 14 13 16  9 12]
[0, 1, 4, 7, 9, 10, 12, 13, 14, 16]

如果存在重复项,则将崩溃,因为在删除具有重复项的最小值时,重复项也将被删除,这会引发循环逻辑。

# duplicate values
adupl = np.random.randint(0, 9, (10,))

print(adupl)
# next line would crash
#print(selectionSort(adupl))

一种解决方法是只删除一份副本。例如,可以使用argmin来完成,该操作返回最小值的一个索引,而不是其值。

def selectionSort2(arr):
    arr = np.array(arr)
    sorted = np.empty_like(arr)
    for i in range(len(sorted)):
        j = arr.argmin()
        sorted[i] = arr[j]
        arr = np.delete(arr, j)
    return sorted

print(selectionSort2(adupl))

这有效,但效率极低,因为np.delete或多或少是O(n)。用边界元素交换最小元素然后将其切掉会更便宜:

def selectionSort3(arr):
    arr = np.array(arr)
    sorted = np.empty_like(arr)
    for i in range(len(sorted)):
        j = arr[i:].argmin()
        sorted[i] = arr[i + j]
        arr[i], arr[i + j] = arr[i + j], arr[i]
    return sorted

print(selectionSort3(adupl))

看看selectionSort3,我们可以发现实际上并不需要单独的输出sorted,因为arr已经被就位了:

def selectionSort4(arr):
    arr = np.array(arr)
    for i in range(len(arr)):
        j = arr[i:].argmin()
        arr[i], arr[i + j] = arr[i + j], arr[i]
    return arr

print(selectionSort4(adupl))

样本输出(aduplselectionSort2-4的输出):

[0 4 3 8 8 4 5 0 4 2]
[0 0 2 3 4 4 4 5 8 8]
[0 0 2 3 4 4 4 5 8 8]
[0 0 2 3 4 4 4 5 8 8]