微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有一种方法可以使数组列表从第一列中排序出来?

如何解决有没有一种方法可以使数组列表从第一列中排序出来?

我必须列出从第一列编号开始分组的数组列表。这是使用numpy。 我有以下数组; X。第一列显示数组应如何组织为数字0、1、3和4。

x = np.array([[0,3],[1,2,[4,0],[3,2],[0,3]])

我发现了如何对数组进行排序:

data = x[np.argsort(x[:,0])]
print(data)
[[0 0 0 0 3]
 [0 0 0 0 3]
 [1 0 0 2 3]
 [1 0 0 2 3]
 [3 0 0 0 2]
 [4 0 0 0 0]]

但是输出必须是包含数组元素的列表 像这样:

list_of_arrays = np.array([[[0,3]],[[0,2]],0]]])

因此,第一列用作数组在列表中的外观的标记。 一般而言,我对python和编码尚不陌生,因此不胜感激。

解决方法

单线:

[np.row_stack(x[np.where(x[:,0] == y)])[:,1:] for y in set(x[:,0])]
[array([[0,3],[0,3]]),array([[0,2,2]]),0]])]

说明:这是一个列表理解,其中set()首先从第一矩阵列中选择所有唯一值。理解将遍历所有这些值,np.where会找到以每个值开头的行的索引。然后,通过切片表达式删除每行的第一列,并按row_stack()将行分组为数组。

,

您需要将第一个值分组,然后可以使用fromiter创建新数组,并相应地调整它们的大小,然后重新插入数组:

import numpy as np
from itertools import chain,groupby,tee

x = np.array([[0,[1,[4,0],[3,2],3]])


def fromiter2d_drop_first(it,dtype):
    # modified from
    # https://stackoverflow.com/a/45738134/7505395 
    it,it2 = tee(it)
    length = sum(1 for _ in it2) 

    flattened = chain.from_iterable(it)
    array_1d = np.fromiter(flattened,dtype)
    array_2d = np.reshape(array_1d,(length,-1))
    return array_2d [:,1:]


data = x[np.argsort(x[:,0])]
groups = np.array( [fromiter2d_drop_first(v,int) 
                    for k,v in groupby(data,key=lambda i:i[0])],dtype=object)
print(groups)

输出:

[array([[0,3]])
 array([[0,3]]) 
 array([[0,2]])
 array([[0,0]])]
,

解决方案:
这可能会帮助您:

import numpy as np
from itertools import groupby
from operator import itemgetter

x = np.array([[0,3]])

def get_arr_lists(iterr):
    tmp_list = []
    for val in iterr:
        tmp_list.append(val[1:])
    return tmp_list

data = x[np.argsort(x[:,0])]

final_arr = [get_arr_lists(iterr) for x,iterr in groupby(data,key = itemgetter(0))]

print(final_arr)

输出:

[
    [array([0,3]),array([0,3])],[array([0,2])],0])]
]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。