对numpy mix-typed matrices进行排序

时间:2013-02-13 14:21:49

标签: python sorting numpy matrix

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

之后
[ 
[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],
...
]

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

1 个答案:

答案 0 :(得分: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。

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

a[a[:,1].argsort()] # Replace 1 with the index you need