问题描述
我必须列出从第一列编号开始分组的数组列表。这是使用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])]
]