Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按列对NumPy中的数组进行排序_Python_Arrays_Sorting_Numpy_Scipy - Fatal编程技术网

Python 按列对NumPy中的数组进行排序

Python 按列对NumPy中的数组进行排序,python,arrays,sorting,numpy,scipy,Python,Arrays,Sorting,Numpy,Scipy,如何按第n列对NumPy中的数组进行排序 比如说, a = array([[9, 2, 3], [4, 5, 6], [7, 0, 5]]) 我想按第二列对行进行排序,以便返回: array([[7, 0, 5], [9, 2, 3], [4, 5, 6]]) 要按a的第二列进行排序: a[a[:, 1].argsort()] 要按a的第二列进行排序: a[a[:, 1].argsort()] 这实际上是最优雅的方式

如何按第n列对NumPy中的数组进行排序

比如说,

a = array([[9, 2, 3],
           [4, 5, 6],
           [7, 0, 5]])
我想按第二列对行进行排序,以便返回:

array([[7, 0, 5],
       [9, 2, 3],
       [4, 5, 6]])

要按
a的第二列进行排序

a[a[:, 1].argsort()]

要按
a的第二列进行排序

a[a[:, 1].argsort()]
这实际上是最优雅的方式

有关“正确”的方法,请参见的order关键字参数

但是,您需要将数组视为带有字段的数组(结构化数组)

如果最初没有用字段定义数组,那么“正确”的方法非常难看

作为一个快速示例,要对其进行排序并返回副本,请执行以下操作:

In [1]: import numpy as np

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

In [3]: np.sort(a.view('i8,i8,i8'), order=['f1'], axis=0).view(np.int)
Out[3]: 
array([[0, 0, 1],
       [1, 2, 3],
       [4, 5, 6]])
要将其排序到位,请执行以下操作:

In [6]: a.view('i8,i8,i8').sort(order=['f1'], axis=0) #<-- returns None

In [7]: a
Out[7]: 
array([[0, 0, 1],
       [1, 2, 3],
       [4, 5, 6]])
[6]中的
:a.view('i8,i8,i8').sort(order=['f1',axis=0)#实际上是最优雅的方式

有关“正确”的方法,请参见的order关键字参数

但是,您需要将数组视为带有字段的数组(结构化数组)

如果最初没有用字段定义数组,那么“正确”的方法非常难看

作为一个快速示例,要对其进行排序并返回副本,请执行以下操作:

In [1]: import numpy as np

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

In [3]: np.sort(a.view('i8,i8,i8'), order=['f1'], axis=0).view(np.int)
Out[3]: 
array([[0, 0, 1],
       [1, 2, 3],
       [4, 5, 6]])
要将其排序到位,请执行以下操作:

In [6]: a.view('i8,i8,i8').sort(order=['f1'], axis=0) #<-- returns None

In [7]: a
Out[7]: 
array([[0, 0, 1],
       [1, 2, 3],
       [4, 5, 6]])
[6]中的
:a.view('i8,i8,i8').sort(order=['f1',axis=0)#从,我想你可以做:

a = ([[1, 2, 3], [4, 5, 6], [0, 0, 1]]); 
a = sorted(a, key=lambda a_entry: a_entry[1]) 
print a
输出为:

[[[0, 0, 1], [1, 2, 3], [4, 5, 6]]]
从中,我认为您可以做到:

a = ([[1, 2, 3], [4, 5, 6], [0, 0, 1]]); 
a = sorted(a, key=lambda a_entry: a_entry[1]) 
print a
输出为:

[[[0, 0, 1], [1, 2, 3], [4, 5, 6]]]
从中,这里是另一个解决方案:

>>> a
array([[1, 2],
       [0, 0],
       [1, 0],
       [0, 2],
       [2, 1],
       [1, 0],
       [1, 0],
       [0, 0],
       [1, 0],
      [2, 2]])
>>> a[np.lexsort(np.fliplr(a).T)]
array([[0, 0],
       [0, 0],
       [0, 2],
       [1, 0],
       [1, 0],
       [1, 0],
       [1, 0],
       [1, 2],
       [2, 1],
       [2, 2]])
从中,这里是另一个解决方案:

>>> a
array([[1, 2],
       [0, 0],
       [1, 0],
       [0, 2],
       [2, 1],
       [1, 0],
       [1, 0],
       [0, 0],
       [1, 0],
      [2, 2]])
>>> a[np.lexsort(np.fliplr(a).T)]
array([[0, 0],
       [0, 0],
       [0, 2],
       [1, 0],
       [1, 0],
       [1, 0],
       [1, 0],
       [1, 2],
       [2, 1],
       [2, 2]])

如果有人想在其计划的关键部分使用排序,这里是不同方案的性能比较:

import numpy as np
table = np.random.rand(5000, 10)

%timeit table.view('f8,f8,f8,f8,f8,f8,f8,f8,f8,f8').sort(order=['f9'], axis=0)
1000 loops, best of 3: 1.88 ms per loop

%timeit table[table[:,9].argsort()]
10000 loops, best of 3: 180 µs per loop

import pandas as pd
df = pd.DataFrame(table)
%timeit df.sort_values(9, ascending=True)
1000 loops, best of 3: 400 µs per loop

因此,使用索引似乎是迄今为止最快的方法…

如果有人想在其程序的关键部分使用排序,下面是不同方案的性能比较:

import numpy as np
table = np.random.rand(5000, 10)

%timeit table.view('f8,f8,f8,f8,f8,f8,f8,f8,f8,f8').sort(order=['f9'], axis=0)
1000 loops, best of 3: 1.88 ms per loop

%timeit table[table[:,9].argsort()]
10000 loops, best of 3: 180 µs per loop

import pandas as pd
df = pd.DataFrame(table)
%timeit df.sort_values(9, ascending=True)
1000 loops, best of 3: 400 µs per loop

因此,使用索引似乎是迄今为止最快的方法…

您可以按照Steve Tjoa的方法对多个列进行排序,方法是使用稳定的排序(如mergesort)并将索引从最低有效列排序到最高有效列:

a = a[a[:,2].argsort()] # First sort doesn't need to be stable.
a = a[a[:,1].argsort(kind='mergesort')]
a = a[a[:,0].argsort(kind='mergesort')]

这将按列0、1、2进行排序。

您可以按照Steve Tjoa的方法对多个列进行排序,方法是使用稳定的排序(如mergesort)并将索引从最低有效列排序到最高有效列:

a = a[a[:,2].argsort()] # First sort doesn't need to be stable.
a = a[a[:,1].argsort(kind='mergesort')]
a = a[a[:,0].argsort(kind='mergesort')]

这将按第0列、第1列、第2列进行排序。

稍微复杂一点的
lexsort
示例-从第1列开始递减,从第2列开始递增。
lexsort
的诀窍在于它按行排序(因此是
.T
),并优先于最后一行

In [120]: b=np.array([[1,2,1],[3,1,2],[1,1,3],[2,3,4],[3,2,5],[2,1,6]])
In [121]: b
Out[121]: 
array([[1, 2, 1],
       [3, 1, 2],
       [1, 1, 3],
       [2, 3, 4],
       [3, 2, 5],
       [2, 1, 6]])
In [122]: b[np.lexsort(([1,-1]*b[:,[1,0]]).T)]
Out[122]: 
array([[3, 1, 2],
       [3, 2, 5],
       [2, 1, 6],
       [2, 3, 4],
       [1, 1, 3],
       [1, 2, 1]])

稍微复杂一点的
lexsort
示例-从第1列开始下降,从第2列开始上升。
lexsort
的诀窍在于它按行排序(因此是
.T
),并优先于最后一行

In [120]: b=np.array([[1,2,1],[3,1,2],[1,1,3],[2,3,4],[3,2,5],[2,1,6]])
In [121]: b
Out[121]: 
array([[1, 2, 1],
       [3, 1, 2],
       [1, 1, 3],
       [2, 3, 4],
       [3, 2, 5],
       [2, 1, 6]])
In [122]: b[np.lexsort(([1,-1]*b[:,[1,0]]).T)]
Out[122]: 
array([[3, 1, 2],
       [3, 2, 5],
       [2, 1, 6],
       [2, 3, 4],
       [1, 1, 3],
       [1, 2, 1]])

我也有类似的问题

我的问题:

我想计算SVD,需要按降序对我的进行排序。但是我想保持特征值和特征向量之间的映射。 我的特征值在第一行,下面对应的特征向量在同一列

所以我想按第一行降序对二维数组按列进行排序

我的解决方案

a = a[::, a[0,].argsort()[::-1]]
那么这是如何工作的呢

a[0,]
只是我要排序的第一行

现在我使用argsort来获得索引的顺序

我使用
[::-1]
,因为我需要降序


最后,我使用
a[:,…]
以正确的顺序获取列的视图。

我也遇到了类似的问题

我的问题:

我想计算SVD,需要按降序对我的进行排序。但是我想保持特征值和特征向量之间的映射。 我的特征值在第一行,下面对应的特征向量在同一列

所以我想按第一行降序对二维数组按列进行排序

我的解决方案

a = a[::, a[0,].argsort()[::-1]]
那么这是如何工作的呢

a[0,]
只是我要排序的第一行

现在我使用argsort来获得索引的顺序

我使用
[::-1]
,因为我需要降序


最后,我使用
a[::,…]
以正确的顺序获取列的视图。

这里是另一个考虑所有列的解决方案(以更简洁的方式回答)

用lexsort排序

ar[np.lexsort(([ar[:, i] for i in range(ar.shape[1]-1, -1, -1)]))]
输出:

array([[0, 0, 0, 1],
       [0, 0, 1, 0],
       [0, 1, 0, 0],
       [1, 0, 0, 1],
       [1, 0, 1, 0],
       [1, 1, 0, 0]])
[[7 0 5]
 [9 2 3]
 [4 5 6]]

下面是另一个考虑到所有列的解决方案(更简洁的方法是使用的答案)

用lexsort排序

ar[np.lexsort(([ar[:, i] for i in range(ar.shape[1]-1, -1, -1)]))]
输出:

array([[0, 0, 0, 1],
       [0, 0, 1, 0],
       [0, 1, 0, 0],
       [1, 0, 0, 1],
       [1, 0, 1, 0],
       [1, 1, 0, 0]])
[[7 0 5]
 [9 2 3]
 [4 5 6]]

只需使用sort,就可以使用要排序的列号

a = np.array([1,1], [1,-1], [-1,1], [-1,-1]])
print (a)
a=a.tolist() 
a = np.array(sorted(a, key=lambda a_entry: a_entry[0]))
print (a)

只需使用sort,就可以使用要排序的列号

a = np.array([1,1], [1,-1], [-1,1], [-1,-1]])
print (a)
a=a.tolist() 
a = np.array(sorted(a, key=lambda a_entry: a_entry[0]))
print (a)

这是一个老问题,但如果您需要将其推广到高于2维的数组,下面是一个很容易推广的解决方案:

np.einsum('ij->ij', a[a[:,1].argsort(),:])
对于二维而言,这是一种过度的杀伤力,
a[a[:,1].argsort()]
根据@steve的回答就足够了,但是这个答案不能推广到更高的维度。你可以找到

输出:

array([[0, 0, 0, 1],
       [0, 0, 1, 0],
       [0, 1, 0, 0],
       [1, 0, 0, 1],
       [1, 0, 1, 0],
       [1, 1, 0, 0]])
[[7 0 5]
 [9 2 3]
 [4 5 6]]

这是一个老问题,但如果您需要将其推广到高于2维的数组,下面是一个很容易推广的解决方案:

np.einsum('ij->ij', a[a[:,1].argsort(),:])
对于二维而言,这是一种过度的杀伤力,
a[a[:,1].argsort()]
根据@steve的回答就足够了,但是这个答案不能推广到更高的维度。你可以找到

输出:

array([[0, 0, 0, 1],
       [0, 0, 1, 0],
       [0, 1, 0, 0],
       [1, 0, 0, 1],
       [1, 0, 1, 0],
       [1, 1, 0, 0]])
[[7 0 5]
 [9 2 3]
 [4 5 6]]
期望的输出是[6,5,4,3,2],[11,10,9,8,7],[16,15,14,13,12],[21,20,19,18,17]

请注意,
argsort(numArray)
返回
numArray
的索引,因为它应该以排序方式排列

范例

x=np.array([8,1,5]) 
z=np.argsort(x) #[1,3,0] are the **indices of the predicted sorted array**
print(x[z]) #boolean indexing which sorts the array on basis of indices saved in z
答案是
[1,5,8]

期望的输出是[6,5,4,3,2],[11,10,9,8,7],[16,15,14,13,12],[21,20,19,18,17]

请注意,
argsort(numArray)
返回索引