【问题标题】:Sorting method producing different output in Python Array versus Numpy Array在 Python Array 与 Numpy Array 中产生不同输出的排序方法
【发布时间】:2021-02-12 22:56:49
【问题描述】:

下面还有一些代码正在执行合并排序。 它是使用 python 整数数组(整数列表)作为我的初始测试用例来实现的。这进展顺利。 但是,一旦这工作正常,我生成了一组随机数字以进一步测试。这个列表是一个 numpy 数组。 归并排序不适用于 numpy 数组,结果看起来像重复的数字,并且重建没有按预期工作。

我的假设是细分数组传递给合并排序然后在内存中重新组合的方式在两者之间是不同的,这就是导致问题的原因。不过,我不确定。

有什么想法吗?

示例数组: 合作:

Array = [48,44,19,59,72,80,42,65,82,8,95,68]

不合作

unsorted = np.random.randint(1, 1000, 150)

归并排序代码:

#function for merging two sub-arrays
def merge(left, right, Array):
    i = 0
    j = 0
    k = 0

    while (i < len(left) and j < len(right)):
        if (left[i] < right[j]):
            Array[k] = left[i]
            i = i+1
        else:
            Array[k] = right[j]
            j = j+1

        k = k+1

    while (i < len(left)):
        Array[k] = left[i]
        i = i+1
        k = k+1

    while (j < len(right)):
        Array[k] = right[j]
        j = j+1
        k = k+1
 
#function for dividing and calling merge function
def mergesort(Array):
    n = len(Array)
    if (n < 2):
        return

    mid = n / 2
    
    left = Array[0 : int(np.round(mid))]
    right  = Array[int(np.round(mid)) : n]
    print("array size = {}, leftsize= {}, rightsize= {}".format(n, len(left), len(right)))

    mergesort(left)
    mergesort(right)

    merge(left, right, Array)
    
    return Array

然后只需要调用以下来比较输出:

mergesort(Array)
mergesort(unsorted)

【问题讨论】:

  • 你试过mid = n // 2 i/o int(np.round(mid))吗?
  • 有趣的是,您的 unsortedarrayArraylist
  • 嗨,这是一个很好的舍入解决方法,但不幸的是结果仍然相同。
  • @KlausD。是的,Python 数组只是一个列表,对吧?但从根本上说,我不确定他们为什么会产生如此不同的结果。一个有效,另一个无效。
  • 不,list 不仅仅是array 的名称。它们唯一的共同点是它们使用[ ] 语法并且它们是项的有序集合。

标签: python arrays sorting mergesort


【解决方案1】:

merge 的开头添加left = left.copy(),否则它是Array 的视图,因此写入Array 会覆盖left

right 也是一个视图,但没关系,因为您不会比阅读它更快地覆盖它)

【讨论】:

  • @Didier:欢迎来到一个令人困惑的世界:python 列表的切片(作为向量实现并使用其他语言的数组语法)复制数据,而 numpy 数组的切片使用相同的语法只是所述对象的视图,共享数据。
猜你喜欢
  • 2011-04-22
  • 2023-01-30
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多