我如何排序一个NumPy数组的第n列?
例如,给定:
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
我想对a的行按第二列进行排序,得到:
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
我如何排序一个NumPy数组的第n列?
例如,给定:
a = array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
我想对a的行按第二列进行排序,得到:
array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
当前回答
正如Python文档wiki所建议的:
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]]]
其他回答
def sort_np_array(x, column=None, flip=False):
x = x[np.argsort(x[:, column])]
if flip:
x = np.flip(x, axis=0)
return x
数组在原来的问题:
a = np.array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
问题作者所期望的sort_np_array函数的结果:
sort_np_array(a, column=1, flip=False)
[2]: array([[7, 0, 5],
[9, 2, 3],
[4, 5, 6]])
简单地使用排序,使用您想要排序的列号。
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)
感谢这篇文章:https://stackoverflow.com/a/5204280/13890678
我用结构化数组找到了一个更“通用”的答案。 我认为这种方法的一个优点是代码更容易阅读。
import numpy as np
a = np.array([[9, 2, 3],
[4, 5, 6],
[7, 0, 5]])
struct_a = np.core.records.fromarrays(
a.transpose(), names="col1, col2, col3", formats="i8, i8, i8"
)
struct_a.sort(order="col2")
print(struct_a)
[(7, 0, 5) (9, 2, 3) (4, 5, 6)]
如果有人想在程序的关键部分使用排序,这里是不同方案的性能比较:
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
所以,看起来使用argsort进行索引是目前为止最快的方法…
#用于按列1排序
indexofsort=np.argsort(dataset[:,0],axis=-1,kind='stable')
dataset = dataset[indexofsort,:]