Python(Numpy)数组排序

Posted

技术标签:

【中文标题】Python(Numpy)数组排序【英文标题】:Python (Numpy) array sorting 【发布时间】:2011-06-30 03:56:24 【问题描述】:

我有这个数组,名为 v,dtype('float64'):

array([[  9.33350000e+05,   8.75886500e+06,   3.45765000e+02],
       [  4.33350000e+05,   8.75886500e+06,   6.19200000e+00],
       [  1.33360000e+05,   8.75886500e+06,   6.76650000e+02]])

... 我使用 np.loadtxt 命令从文件中获取的。我想在第一列的值之后对其进行排序,而不会混淆将同一行上列出的数字保持在一起的结构。使用 v.sort(axis=0) 给了我:

array([[  1.33360000e+05,   8.75886500e+06,   6.19200000e+00],
       [  4.33350000e+05,   8.75886500e+06,   3.45765000e+02],
       [  9.33350000e+05,   8.75886500e+06,   6.76650000e+02]])

...即将第三列的最小数字放在第一行等。我宁愿想要这样的东西...

array([[  1.33360000e+05,   8.75886500e+06,   6.76650000e+02],
       [  4.33350000e+05,   8.75886500e+06,   6.19200000e+00],
       [  9.33350000e+05,   8.75886500e+06,   3.45765000e+02]])

... 每行的元素彼此之间没有相对移动。

【问题讨论】:

【参考方案1】:

试试

v[v[:,0].argsort()]

v 是数组)。 v[:,0] 是第一列,.argsort() 返回将对第一列进行排序的索引。然后,您可以使用高级索引将此排序应用于整个数组。请注意,您将获得数组的排序副本。

我知道对数组进行排序的唯一方法是使用记录 dtype:

v.dtype = [("x", float), ("y", float), ("z", float)]
v.shape = v.size
v.sort(order="x")

【讨论】:

【参考方案2】:

或者

试试

import numpy as np

order = v[:, 0].argsort()
sorted = np.take(v, order, 0)

'order' 具有第一行的顺序。 然后 'np.take' 将列按相应的顺序排列。

查看 'np.take' as 的帮助

help(np.take)

take(a, indices, axis=None, out=None, 模式='提高') 沿轴从数组中获取元素。

This function does the same thing as "fancy" indexing (indexing arrays
using arrays); however, it can be easier to use if you need elements
along a given axis.

Parameters
----------
a : array_like
    The source array.
indices : array_like
    The indices of the values to extract.
axis : int, optional
    The axis over which to select values. By default, the flattened
    input array is used.
out : ndarray, optional
    If provided, the result will be placed in this array. It should
    be of the appropriate shape and dtype.
mode : 'raise', 'wrap', 'clip', optional
    Specifies how out-of-bounds indices will behave.

    * 'raise' -- raise an error (default)
    * 'wrap' -- wrap around
    * 'clip' -- clip to the range

    'clip' mode means that all indices that are too large are

替换 通过寻址沿该轴的最后一个元素的索引。笔记 这会禁用负数索引。

Returns
-------
subarray : ndarray
    The returned array has the same type as `a`.

See Also
--------
ndarray.take : equivalent method

Examples
--------
>>> a = [4, 3, 5, 7, 6, 8]
>>> indices = [0, 1, 4]
>>> np.take(a, indices)
array([4, 3, 6])

In this example if `a` is an ndarray, "fancy" indexing can be used.

>>> a = np.array(a)
>>> a[indices]
array([4, 3, 6])

【讨论】:

【参考方案3】:

如果您的实例中 v[:,0] 具有一些相同的值,并且您希望对第 1、2 列等进行二次排序,那么您将希望使用 numpy.lexsort()numpy.sort(v, order=('col1', 'col2', etc..),但对于 @987654326 @case,v 需要是结构化数组。

【讨论】:

【参考方案4】:

numpy.lexsort() 的示例应用程序用于对数组的行进行排序并处理第一列中的关系。请注意,lexsort 有效地对列进行排序并从最后一列开始,因此您需要反转 a 的行,然后在 lexsort 之前进行转置,最后转置结果(您会认为这应该是更简单,但是嘿!):

In [1]: import numpy as np

In [2]: a = np.array([[1,2,3,4],[1,0,4,1],[0,4,1,1]])

In [3]: a[np.lexsort(np.flip(a, axis=1).T).T]
Out[3]: 
array([[0, 4, 1, 1],
       [1, 0, 4, 1],
       [1, 2, 3, 4]])

In [4]: a
Out[4]: 
array([[1, 2, 3, 4],
       [1, 0, 4, 1],
       [0, 4, 1, 1]])

感谢@Paul 提出使用lexsort 的建议。

【讨论】:

以上是关于Python(Numpy)数组排序的主要内容,如果未能解决你的问题,请参考以下文章

python中的列表及numpy数组排序

Python numpy 保留已排序二维数组的索引列表

python 在Numpy中按第n列排序数组

python 在Numpy中按第n列排序数组

python 二维数组排序

Python计算两个numpy数组的交集(Intersection)实战:两个输入数组的交集并排序获取交集元素及其索引如果输入数组不是一维的,它们将被展平(flatten),然后计算交集