我必须列出从第一列编号开始分组的数组列表。这是使用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和编码尚不陌生,因此不胜感激。
答案 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])]
]