python - 按列在NumPy中对数组进行排序

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

例如,

a = array([[9, 2, 3],

[4, 5, 6],

[7, 0, 5]])

我想按第二列对行进行排序,以便我回来:

array([[7, 0, 5],

[9, 2, 3],

[4, 5, 6]])

9个解决方案

512 votes

我想这是有效的:a[a[:,1].argsort()]

Steve Tjoa answered 2019-03-05T19:26:03Z

91 votes

@ steve"s实际上是最优雅的做法。

对于“正确”方式,请参阅numpy.ndarray.sort的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]])

据我所知,@ Steve真的是最优雅的做法...

此方法的唯一优点是“order”参数是用于对搜索进行排序的字段列表。 例如,您可以按第二列,然后是第三列,然后通过提供order = ["f1","f2","f0"]排序第一列。

Joe Kington answered 2019-03-05T19:25:39Z

20 votes

您可以按照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。

J.J answered 2019-03-05T19:26:33Z

17 votes

从Python文档维基,我认为你可以做到:

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]]]

user541064 answered 2019-03-05T19:26:58Z

13 votes

如果有人想在其程序的关键部分使用排序,则可以对不同的建议进行性能比较:

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进行索引是迄今为止最快的方法...

MonkeyButter answered 2019-03-05T19:27:29Z

13 votes

从NumPy邮件列表中,这是另一个解决方案:

>>> 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]])

fgregg answered 2019-03-05T19:27:53Z

3 votes

我遇到了类似的问题。

我的问题:

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

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

我的解决方案

a = a[::, a[0,].argsort()[::-1]]

那么这是如何工作的呢?

a[::, ...]只是我要排序的第一行。

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

我使用a[::, ...],因为我需要降序。

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

xuma202 answered 2019-03-05T19:29:09Z

1 votes

稍微复杂一点的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]])

hpaulj answered 2019-03-05T19:29:34Z

0 votes

这是考虑所有专栏的另一种解决方案(J.J的答案更简洁的方式);

ar=np.array([[0, 0, 0, 1],

[1, 0, 1, 0],

[0, 1, 0, 0],

[1, 0, 0, 1],

[0, 0, 1, 0],

[1, 1, 0, 0]])

用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]])

Sefa answered 2019-03-05T19:30:06Z

python数组排序-python - 按列在NumPy中对数组进行排序相关推荐

  1. Python中用pandas将numpy中的数组数据保存到csv文件

    Python中用pandas将numpy中的数组数据保存到csv文件 本博客转载自:[1]https://blog.csdn.net/grey_csdn/article/details/7018587 ...

  2. python 数列筛选_对numpy中的数组条件筛选功能详解

    在程序设计中,时常会遇到数据的唯一化.相同.相异信息的提取等工作,在格式化的向量存储矩阵中南,numpy能够提供比较不错的快速处理功能. 1,唯一化的实现: In [63]: data = np.ar ...

  3. python 矩阵元素赋值_对numpy中数组元素的统一赋值实例

    Numpy中的数组整体处理赋值操作一直让我有点迷糊,很多时候理解的不深入.今天单独列写相关的知识点,进行总结一下. 先看两个代码片小例子: 例子1: In [2]: arr =np.empty((8, ...

  4. 1.numpy中三维数组的理解

    numpy中三维数组的理解 三维数组图形--立方体 图片中的三维数组 RNN中序列数据的三维数组 迭代数据中的三维数组 三维数组图形–立方体 我们在做图像处理,RNN序列数据,迭代数据的时候会遇到三维 ...

  5. PIL中的Image和numpy中的数组array相互转换

    PIL中的Image和numpy中的数组array相互转换 array转换成image 1 Image.fromarray(np.uint8(img)) https://www.cnblogs.com ...

  6. [转载] java中对数组进行排序_如何在Java中对数组排序

    参考链接: Java中main()的有效变体 java中对数组进行排序 Java Array is like a container that can hold a fixed number of t ...

  7. java中对数组进行排序_如何在Java中对数组排序

    java中对数组进行排序 Java Array is like a container that can hold a fixed number of the same type of items, ...

  8. python数组求和_Python NumPy中的数组求和函数sum | 坐倚北风

    在Python中可以使用NumPy中的sum函数来进行数值求和,sum方法的格式如下: numpy.sum(a, axis=None, dtype=None, out=None, keepdims=, ...

  9. 【Python进阶】你真的明白NumPy中的ndarray吗?

    欢迎来到专栏<Python进阶>.在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件.数据的处理,Python各种好用的库如NumPy.Scipy.Matplotl ...

最新文章

  1. 虚拟化技术KVM的搭建
  2. 异步请求(简单一说)
  3. 20155330 实验四 Android程序设计
  4. 让人期待的2011年度最佳 jQuery 插件发布啦
  5. C# WinFrom 用Execl做模版进行数据导入简介
  6. github速成手册
  7. JAVA开发一个合并单元格报表_9、docx4j实现动态表格(编程式)单元格合并
  8. 织梦采集侠推荐免登陆免规则伪原创发布配置
  9. python调用默认播放器_在PotPlayer和MPV挂载SVP脚本进行补帧的部署方法
  10. ListView分页操作
  11. 7大Python IDE工具推荐
  12. 虚拟化主机系统在线web管理平台
  13. Beaglebone Black–I2C 接 BMP280 获取当前温度
  14. 4步用Python搞定客户细分!
  15. Xmind2021安装激活破解
  16. tableau app android,tableau 安卓
  17. 给计算机图片文件夹加密码,文件夹怎么设置密码
  18. 登录QQ出现R6030-CRT not initialized
  19. 江海大作业(仅供参考,需要)
  20. 游戏编程中的人工智能技术-演化算法入门

热门文章

  1. js实现页面跳转与参数获取加载
  2. 藏在达达财报里的稳与忧
  3. 推荐系统(一)好友推荐
  4. php 网页截屏,php使用CutyCapt实现网页截图保存的方法
  5. mysql disabled enabled_disabled与enabled是什么?disabled与enabled属性详解
  6. 苹果怎么关闭自动亮度_小米10的自动亮度到底有什么玄机?听听高管怎么说
  7. C语言排序算法(一)——选择排序实现
  8. android n名称,Android N正式命名为“牛轧糖”,谷歌这一桌子甜点你吃过几个?
  9. 鸿蒙系统手机开机,华为鸿蒙手机开机界面曝光!谷歌安卓被正式取代:打响全球OS争夺战...
  10. 现代年轻人最需要的是消除内耗!