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

时间:2020-10-14 09:09:26

标签: python list numpy

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

x = np.array([[0,0,0,0,3],
              [1,0,0,2,3],
              [4,0,0,0,0],
              [3,0,0,0,2],
              [0,0,0,0,3],
              [1,0,0,2,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,0,0,3],
                            [0,0,0,3]], 
                           [[0,0,2,3],[0,0,2,3]], 
                           [[0,0,0,2]],
                           [[0,0,0,0]]])

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

3 个答案:

答案 0 :(得分:0)

单线:

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

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

答案 1 :(得分:0)

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

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

x = np.array([[0,0,0,0,3],
              [1,0,0,2,3],
              [4,0,0,0,0],
              [3,0,0,0,2],
              [0,0,0,0,3],
              [1,0,0,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, 0, 0, 3], [0, 0, 0, 3]])
 array([[0, 0, 2, 3], [0, 0, 2, 3]]) 
 array([[0, 0, 0, 2]])
 array([[0, 0, 0, 0]])]

答案 2 :(得分:0)

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

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

x = np.array([[0,0,0,0,3],
              [1,0,0,2,3],
              [4,0,0,0,0],
              [3,0,0,0,2],
              [0,0,0,0,3],
              [1,0,0,2,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, 0, 0, 3]), array([0, 0, 0, 3])], 
    [array([0, 0, 2, 3]), array([0, 0, 2, 3])], 
    [array([0, 0, 0, 2])], 
    [array([0, 0, 0, 0])]
]