0

我想对每列包含相同类型但每列可能有不同类型的此类(更宽)矩阵进行排序。这种排序应该执行,以便一行的所有列保持在一起,但行顺序遵循定义列的值

[ 
[1, 0, 0.25,'ind1', 'pop2', 0.56],
[2, 0, 0.35,'ind2', 'pop2', 0.58],
[1, 0, 0.23,'ind1', 'pop1', 0.66],
...
]

在这里,我按第 2 列(浮点列)执行排序算法

[ 
[1, 0, 0.23,'ind1', 'pop1', 0.66],
[1, 0, 0.25,'ind1', 'pop2', 0.56],
[2, 0, 0.35,'ind2', 'pop2', 0.58],
...
]

如果列包含字符类型,它会改变吗?感谢您的帮助和建议,但检查了 lexsort、sort、argsort ......但可能是错误的方式。编辑:我不知道为什么,但是如果我的矩阵被定义为 numpy.matrix(),argsort() 方法会添加一个维度(所以三个维度的结果),如果矩阵是使用 numpy.array( )。如果它可以帮助更多的读者。

4

1 回答 1

1

如果您的数据类型具有命名字段,则可以使用 numpy.sort,在“order”参数中指定要排序的字段名称:

import numpy 

fieldTypes = ['i4', 'i4', 'f8', 'S4', 'S4', 'f8'] # data types of each field
fieldNames = ['a', 'b', 'c', 'd', 'e', 'f'] # names of the fields, feel free to give more descriptive names

myType = numpy.dtype(zip(fieldNames, fieldTypes)) # Create a numpy data type based on the types and fields

a = numpy.array([(1, 0, 0.25,'ind1', 'pop2', 0.56),
(2, 0, 0.35,'ind2', 'pop2', 0.58),
(1, 0, 0.23,'ind1', 'pop1', 0.66)], dtype=myType) # Create the array with the right dtype

print numpy.sort(a, order=['c']) # sort based on column 'c'

请注意,如果您正在创建一个空缓冲区或从现有文件/缓冲区加载 numpy 数据,您仍然可以将其转换为具有命名字段的 dtype。

如果您没有命名字段,这个答案可以帮助您,我推荐@Steve Tjoa 建议的方法:

a[a[:,1].argsort()] # Replace 1 with the index you need
于 2013-02-13T14:48:00.943 回答