2

我想使用 numpy 创建一个方阵,其中除第一行以外的行按第一行的内容排序。例如:

import numpy as np
a = array([['','z','b','d'],
           ['b','2','5','7'],
           ['d','0','1','3'],
           ['z','3','9','2']])

返回:

[['','z','b','d']
 ['z','3','9','2']
 ['b','2','5','7']
 ['d','0','1','3']]
4

2 回答 2

2

这是另一种方式,假设您想要的确实是一种基于第一行的行:

>>> a[[list(a[:, 0]).index(i) for i in a[0]]]
array([['', 'z', 'b', 'd'],
       ['z', '3', '9', '2'],
       ['b', '2', '5', '7'],
       ['d', '0', '1', '3']], 
       dtype='|S1')
于 2012-11-07T00:59:35.597 回答
1

目前尚不清楚为什么要将这些数据放在 numpy 数组中,而字典可能更合适。我假设您想对数据进行一些计算,而您可能不想要字符串 dtype。

在您的示例中,您希望从第一行中的键(可能是字符串)进行排序。如果您想以“方形”形式访问数组(例如像 一样的切片a[:, 2]),这意味着所有元素都将转换为字符串。结构化数组将允许您进行更好的排序,但代价是必须像a[:][2]. 这是一个结构化数组的示例,它将您的数据放入具有字符串 dtype 的数组中'names',并将值作为 dtype 中的整数'values'。您可以通过以下字符串进行排序'names'

a = np.array([('b', [2, 5, 7]),
              ('d', [0, 1, 3]), 
              ('z', [3, 9, 2])],
              dtype=[('names', 'S1'),
                     ('values', '3int')])

您可以分别访问名称和值记录:

>>> a['names']
array(['b', 'd', 'z'], 
      dtype='|S5')

>>> a['values']
array([[2, 5, 7],
       [0, 1, 3],
       [3, 9, 2]])

您可以根据名称的字典排序对值数组进行排序:

>>> a['values'][np.argsort(a['names'])]
array([[2, 5, 7],
       [0, 1, 3],
       [3, 9, 2]])

或者只是使用名称的另一个顺序对数组进行排序:

>>> a['values'][np.argsort(['z', 'b', 'd'])]
array([[0, 1, 3],
       [3, 9, 2],
       [2, 5, 7]])
于 2012-11-06T23:07:16.280 回答