Python结构化的numpy数组多种排序

时间:2016-03-10 07:33:55

标签: python arrays numpy

大家好,我有一个分隔符分隔字符串列表:

lists=['1|Abra|23|43|0','2|Cadabra|15|18|0','3|Grabra|4|421|0','4|Lol|1|15|0']

我需要将它转换为numpy数组,而不是像excel一样按第3列排序,然后按第2列排序,最后一列最后一列 我试过这个:

def man():
a = np.array(lists[0].split('|'))
for line in lists:
    temp = np.array(line.split('|'),)
    a=np.concatenate((a, temp))
a.sort(order=[0, 1])
man()

当然没有运气,因为它错了!不幸的是,我在numpy数组中并不强大。有人可以帮我吗? :(

这对我来说非常完美,但是这里numpy从文件构建数组,以便使其工作我已经将我的字符串列表写入文件而不是读取它并转换为数组

import numpy as np

# let numpy guess the type with dtype=None
my_data = np.genfromtxt('Selector/tmp.txt',delimiter='|', dtype=None, names ["Num", "Date", "Desc", "Rgh" ,"Prc", "Color", "Smb", "MType"])
my_data.sort(order=["Color","Prc", "Rgh"])

# save specifying required format (tab separated values)
print(my_data)

如何按原样保留所有内容但更改转换函数以使其构建相同的数组而不是来自文件但是来自列表

2 个答案:

答案 0 :(得分:0)

可能有更好的解决方案,但首先我会按相反的顺序对每个列排序一次。

我假设你想按第3列排序,并且第2列解决了关系。最后,剩下的关系由最后一列解析。因此,您实际上先按最后一列排序,然后按2排序,再按3排序。

此外,您可以使用列表解析轻松地将列表转换为数组。

import numpy as np

lists=['1|Abra|23|43|0','2|Cadabra|15|18|0','3|Grabra|4|421|0','4|Lol|1|15|0']

# convert to numpy array by splitting each row
a = np.array([l.split('|') for l in lists])

# specify columns to sort by, in order
sort_cols = [3, 2, -1]

# sort by columns in reverse order.
# This only works correctly if the sorting algorithm is stable.
for sc in sort_cols[::-1]:
    order = np.argsort(a[:, sc])
    a = a[order]

print(a)

答案 1 :(得分:0)

您可以使用列表推导来拆分字符串并将整数转换为int。然后使用正确的dtype来创建你的numpy数组,然后通过传递预期的顺序来使用np.sort()函数:

>>> dtype = [('1st', int), ('2nd', '|S7'), ('3rd', int), ('4th', int), ('5th', int)]
>>> 
>>> a = np.array([tuple([int(i) if i.isdigit() else i for i in sub.split('|')]) for sub in delimit_strs], dtype=dtype)

>>> np.sort(a, axis=0, order=['3rd','2nd', '5th'])
array([(4, 'Lol', 1, 15, 0), (3, 'Grabra', 4, 421, 0),
       (2, 'Cadabra', 15, 18, 0), (1, 'Abra', 23, 43, 0)], 
      dtype=[('1st', '<i8'), ('2nd', 'S7'), ('3rd', '<i8'), ('4th', '<i8'), ('5th', '<i8')])

您也可以在python中执行此操作,以便更优化更短的数据集。您可以通过传递正确的密钥函数来简单地使用sorted()函数。

from operator import itemgetter
sorted([[int(i) if i.isdigit() else i for i in sub.split('|')]) for sub in delimit_strs], key=itemgetter(3, 2, 4))