首页 > 解决方案 > 如何通过嵌套的 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 方法。

标签: pythonnumpysorting

解决方案


我了解您有一个张量(三个嵌套数组),并且每个数组元素都是具有嵌套字段的结构化数据类型response.xresponse.y并且response.z.

由于您有一个张量,您可以在三个维度(行、列和 Z 维度)对其进行排序。默认的 numpy 排序行为是对最后一个维度进行排序,即最里面的数组。

要获取嵌套数据结构的排序索引,我们可以使用numpy.argsort(). 它为您提供排序索引。例如,以下将response.xs 沿最外层数组排序(即相互比较行):

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两种用法中将上面第一个示例中的轴参数更改为(或完全删除它)来实现。


推荐阅读