python - 如何通过嵌套的 dtype 对 numpy 数组进行排序?
问题描述
如何按嵌套 dtype 对 numpy 数组进行排序?
我想按数组中的第一个元素对 numpy 数组进行排序
import numpy as np
from random import randint
# create dummy data
test = np.array([[[randint(1, 10) for _ in range(3)]] for _ in range(10)])
dtype = [('response', [('x', 'f'),('y', 'f'),('x', 'f')])]
# convert over to dtype
test.astype(dtype)
如何对嵌套键进行排序?因为以下不起作用
np.sort(a, order='response.x')
我想要实现的是以与列表np.sort
相同的方式使用sorted
a_list = [[[randint(1, 10) for _ in range(3)]
sorted(a_list,key=lambda x: (x[0][0]))
但我想使用np.sort
它,因为这是一个更复杂问题的示例,我只能访问 numpy 数组并希望使用 numpy 方法。
解决方案
我了解您有一个张量(三个嵌套数组),并且每个数组元素都是具有嵌套字段的结构化数据类型response.x
,response.y
并且response.z
.
由于您有一个张量,您可以在三个维度(行、列和 Z 维度)对其进行排序。默认的 numpy 排序行为是对最后一个维度进行排序,即最里面的数组。
要获取嵌套数据结构的排序索引,我们可以使用numpy.argsort()
. 它为您提供排序索引。例如,以下将response.x
s 沿最外层数组排序(即相互比较行):
order = np.argsort(test['response']['x'], axis=0)
然后,您可以使用这些索引对原始数组进行排序。要获得与 相同的行为np.sort
,您将使用numpy.take_along_axis()
相同的axis
参数:
np.take_along_axis(A, order, axis=0)
请注意,这会对行中的各个元素进行排序。这与您的行为相同np.sort(..., axis=0)
。
但是,在我看来,您想通过第一个元素对整个内部数组进行排序,即内部数组中没有单独的重新排序。为此,您可以逐行执行以下操作:
test[order[:,0,0]]
这将按最里面的第一个项目 (0, 0)对整个最外面的数组进行排序。
的默认行为np.sort
是对最后一个维度进行排序,这可以通过在上述-1
两种用法中将上面第一个示例中的轴参数更改为(或完全删除它)来实现。
推荐阅读
- node.js - 如何使用节点 sdk 在 azure 函数中初始化 cosmosDB 数据库和容器?
- azureservicebus - 动态服务总线主题订阅
- javascript - 网页抓取点击下载
- r - 使用分隔符解析文本文件以在 R 中创建数据框?
- css - CSS 类属性不适用于反应组件
- rasa-nlu - 在 redis 中保存 rasa bot 和用户之间的对话
- sql - 将同一表中两列的数据合并为一列并使用 SQL 查询获取计数
- visual-studio-code - VS Code 无法下载测试应用的符号
- apache-kafka - 我如何保证来自消费者端的消息排序?
- java - 类加载器的委托模型如何确保加载唯一的类?