python - 使用 numpy.argsort 对 3D numpy 数组进行排序会产生令人费解的结果
问题描述
假设我有以下数组:
x = array([[[2, 5],
[6, 7]],
[[8, 1],
[4, 9]]])
我想对每个子数组的第一列进行排序以获得以下结果:
out = array([[[2, 5],
[6, 7]],
[[4, 9],
[8, 1]]])
因此,当运行以下代码时:
x[:,x[:,:,0].argsort()]
结果是:
out1 = array([[[[2, 5],
[6, 7]],
[[6, 7],
[2, 5]]],
[[[8, 1],
[4, 9]],
[[4, 9],
[8, 1]]]])
事实证明,我想要的结果在这个 2x2 矩阵的对角线上,所以我仍然可以获得我想要的结果,但我不明白非对角线是什么。看起来它们甚至没有以任何方式排序。
非对角线阵列从何而来?
另外,我怎样才能得到我想要的结果而不必经过这个相当大且无用的数组(out1
)?
解决方案
您需要使用高级索引而不是使用切片:
x[np.arange(len(x))[:,None], x[...,0].argsort()]
#[[[2 5]
# [6 7]]
# [[4 9]
# [8 1]]]
推荐阅读
- javascript - 缩小的javascript代码,我不明白,谁能解释一下
- java - Maven 使用了错误的 java 版本
- python - 如何在 Python 中根据带点的数字分割文本?
- for-loop - 循环遍历液体高级自定义字段以返回多个元字段值
- sql - SQL查询:参数input=[Buyers.Name],获取具有相同[Stores.StoreID]的其他[Buyers.Name]
- python - 使用 Python 批量更新 elasticsearch 文档
- oracle - 内联视图中的 ORA-1427
- amazon-web-services - 查看 Fargate 容器日志需要哪些权限
- c# - 如何将 CSV 数据从 Angular 传递到 C# 字节数组?
- css - 可访问性 - 使下拉(子)菜单键盘也可访问