将嵌套的数组列表与部分空子列表连接起来

Concatenate nested list of array with partial empty sublist

objective 用于连接嵌套的数组列表(即 list_arr)。但是,list_arr 中的某些子列表长度为零。

简单地在 list_arr 上使用 np.arraynp.asarray 不会产生预期的结果。

import numpy as np

ncondition=2
nnodes=30
nsbj=6


np.random.seed(0)

# Example of nested list list_arr

list_arr=[[[np.concatenate([[idx_sbj],[ncondi],[nepoch] ,np.random.rand(nnodes)]) for nepoch in range(np.random.randint(5))] \
 for ncondi in range(ncondition)] for idx_sbj in range(nsbj)]

以下未产生预期的串联输出

test1=np.asarray(list_arr)
test2=np.array(list_arr)
test3= np.vstack(list_arr)

预期输出是一个形状数组 (15,33)

好吧,我的好奇心战胜了我。

从列表中创建一个对象 dtype 数组:

In [280]: arr=np.array(list_arr,object)
In [281]: arr.shape
Out[281]: (6, 2)

这个数组的所有元素都是列表,len:

In [282]: np.frompyfunc(len,1,1)(arr)
Out[282]: 
array([[4, 1],
       [0, 2],
       [0, 2],
       [0, 0],
       [2, 3],
       [1, 0]], dtype=object)

正在查看特定的子列表。一个有两个空列表

In [283]: list_arr[3]
Out[283]: [[], []]

其他人有一个空列表,第一个或第二个:

In [284]: list_arr[-1]
Out[284]: 
[[array([5.        , 0.        , 0.        , 0.3681024 , 0.3127533 ,
         0.80183615, 0.07044719, 0.68357296, 0.38072924, 0.63393096,
         ...])],
 []]

有些有不同数量数组的列表:

如果我将 [282] 中的数字相加,我得到 15,所以那一定是你得到 (15,33) 的地方。并且大概所有的数组都具有相同的长度。

嵌套的外层是没有关系的,所以我们可以拆开它。

In [295]: alist = arr.ravel().tolist()

然后过滤掉空列表,并对剩余列表应用vstack

In [296]: alist = [np.vstack(x) for x in alist if x]
In [297]: len(alist)
Out[297]: 7

还有一个 vstack 加入这些:

In [298]: arr2 = np.vstack(alist)
In [299]: arr2.shape
Out[299]: (15, 33)