目标是连接嵌套的数组列表(即list_arr)。但是,list_arr中的一些子列表的长度为零。
仅在list_arr上使用np.array或np.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)
发布于 2021-11-21 18:03:47
好吧,我的好奇心占了上风。
从列表中创建一个对象数据类型数组:
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)https://stackoverflow.com/questions/70055553
复制相似问题