maxframe.tensor.sort#

maxframe.tensor.sort(a, axis=-1, kind=None, order=None, *, stable=None, parallel_kind=None, psrs_kinds=None, return_index=False, **kw)[源代码]#

返回一个排序后的 tensor 副本。

参数:
  • a (array_like) -- 要排序的 Tensor。

  • axis (int or None, optional) -- 排序的轴。如果为 None,则在排序前将 tensor 展平。默认值为 -1,表示沿最后一个轴排序。

  • kind ({'quicksort', 'mergesort', 'heapsort', 'stable'}, optional) -- 排序算法。默认值为 'quicksort'。注意 'stable' 和 'mergesort' 实际上都使用 timsort 或 radix sort,并且实际实现会根据数据类型变化。保留 'mergesort' 是为了向后兼容。注意,如果 a 在排序轴上有超过 1 个 chunk,该参数不会生效。

  • order (str or list of str, optional) -- 当 a 是一个定义了字段的 tensor 时,该参数指定首先、其次等比较哪些字段。单个字段可以指定为字符串,并非所有字段都需要指定,但未指定的字段仍然会按照它们在 dtype 中出现的顺序用于打破平局。

  • stable (bool, optional) -- 排序稳定性。如果为 True,返回的数组将保持 a 中相等元素的相对顺序。如果为 FalseNone,则不保证这一点。在内部,该选项会选择 kind='stable'。默认值:None

  • parallel_kind ({'PSRS'}, optional) -- 并行排序算法,详情请参考:http://csweb.cs.wfu.edu/bigiron/LittleFE-PSRS/build/html/PSRSalgorithm.html

  • psrs_kinds (list with 3 elements, optional) -- PSRS 算法中的排序算法。

  • return_index (bool) -- 如果为 True,同时返回索引。

返回:

sorted_tensor -- 与 a 类型和形状相同的 Tensor。

返回类型:

Tensor

参见

Tensor.sort

原地排序 tensor 的方法。

argsort

间接排序。

lexsort

基于多个键的间接稳定排序。

searchsorted

在已排序的 tensor 中查找元素。

partition

部分排序。

备注

各种排序算法的特点包括其平均速度、最坏情况性能、工作空间大小以及是否稳定。稳定排序保持具有相同键的元素的相对顺序。NumPy 中实现的四种算法具有以下属性:

类型

速度

最坏情况

工作空间

稳定

'快速排序'

1

O(n^2)

0

'堆排序'

3

O(n*log(n))

0

'归并排序'

2

O(n*log(n))

~n/2

'timsort'

2

O(n*log(n))

~n/2

备注

数据类型决定实际使用 'mergesort' 还是 'timsort',即使指定了 'mergesort'。目前尚不支持用户在更细粒度上进行选择。

所有排序算法在沿除最后一轴之外的其他轴排序时都会创建数据的临时副本。因此,沿最后一轴排序比沿任何其他轴排序更快且占用更少的空间。

复数的排序顺序是字典序的。如果实部和虚部都不是 NaN,则排序由实部决定,除非它们相等,在这种情况下由虚部决定排序顺序。

快速排序已被更改为内省排序(introsort),当排序进度不足时会切换到堆排序。这使其最坏情况的时间复杂度为 O(n*log(n))。

'stable' 会自动为正在排序的数据类型选择最佳的稳定排序算法。它与 'mergesort' 一样,目前根据数据类型映射到 timsort 或基数排序。API 的向后兼容性目前限制了选择实现的能力,并且针对不同的数据类型进行了硬编码。

添加了 Timsort 以提高对已排序或接近排序数据的性能。在随机数据上,timsort 几乎与 mergesort 相同。现在它被用于稳定排序,而如果未指定排序方法,快速排序仍是默认选项。关于 timsort 的详细信息,请参阅 CPython listsort.txt。对于整数数据类型,'mergesort' 和 'stable' 被映射到基数排序。基数排序是一种 O(n) 的排序算法,而不是 O(n log n)。

示例

>>> import maxframe.tensor as mt
>>> a = mt.array([[1,4],[3,1]])
>>> mt.sort(a).execute()                # sort along the last axis
array([[1, 4],
       [1, 3]])
>>> mt.sort(a, axis=None).execute()     # sort the flattened tensor
array([1, 1, 3, 4])
>>> mt.sort(a, axis=0).execute()        # sort along the first axis
array([[1, 1],
       [3, 4]])

使用 order 关键字指定在排序结构化数组时要使用的字段:

>>> dtype = [('name', 'S10'), ('height', float), ('age', int)]
>>> values = [('Arthur', 1.8, 41), ('Lancelot', 1.9, 38),
...           ('Galahad', 1.7, 38)]
>>> a = mt.array(values, dtype=dtype)       # create a structured tensor
>>> mt.sort(a, order='height').execute()
array([('Galahad', 1.7, 38), ('Arthur', 1.8, 41),
       ('Lancelot', 1.8999999999999999, 38)],
      dtype=[('name', '|S10'), ('height', '<f8'), ('age', '<i4')])

按年龄排序,如果年龄相同则按身高排序:

>>> mt.sort(a, order=['age', 'height']).execute()
array([('Galahad', 1.7, 38), ('Lancelot', 1.8999999999999999, 38),
       ('Arthur', 1.8, 41)],
      dtype=[('name', '|S10'), ('height', '<f8'), ('age', '<i4')])