检查numpy数组是否已排序

luc*_*uca 12 python numpy

我有一个numpy数组,我想检查它是否已排序.

>>> a = np.array([1,2,3,4,5])
array([1, 2, 3, 4, 5])
Run Code Online (Sandbox Code Playgroud)

B. *_* M. 23

使用NumPy工具:

np.diff(a)>=0
Run Code Online (Sandbox Code Playgroud)

但是numpy解决方案都是O(n).

如果您想快速编写代码并在未排序的数组上快速得出结论:

import numba
@numba.jit
def is_sorted(a):
    for i in range(a.size-1):
         if a[i+1] < a[i] :
               return False
    return True
Run Code Online (Sandbox Code Playgroud)

在随机数组上是O(1).

  • 我认为你的编辑没有帮助,因为 θ(1) 甚至比 O(1) 更强。您可以进行平均情况分析,但对于大多数实际目的,用不太正式的句子“it Early exits”替换您的 O() 约束可能就足够了。 (4认同)
  • 它是。np.all不是很懒。 (3认同)
  • @BM 我想知道你是否可以称之为 O(1)。O 表示法是“最坏情况”,对吧?那么在最坏的情况下,你将遍历数组中的每个元素,即 O(n)。你同意? (2认同)

luc*_*uca 14

np.all(a[:-1] <= a[1:])
Run Code Online (Sandbox Code Playgroud)

例子:

is_sorted = lambda a: np.all(a[:-1] <= a[1:])

>>> a = np.array([1,2,3,4,9])
>>> is_sorted(a)
True

>>> a = np.array([1,2,3,4,3])
>>> is_sorted(a)
False
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的解决方案,因为 np.diff 使用 __sub__ 的实现,在一般任意类型的情况下,它与排序无关。特别是在无符号数字类型上使用差异会失败。这使用 &lt;= 定义排序。 (8认同)
  • 该解决方案的速度大约是撰写本文时的最佳答案“np.all(np.diff(a) &gt;= 0)”的两倍。 (2认同)

1''*_*1'' 6

低效但易于输入的解决方案:

(a == np.sort(a)).all()
Run Code Online (Sandbox Code Playgroud)