将嵌套的数组列表与部分空子列表连接起来
Concatenate nested list of array with partial empty sublist
objective 用于连接嵌套的数组列表(即 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)
好吧,我的好奇心战胜了我。
从列表中创建一个对象 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)
objective 用于连接嵌套的数组列表(即 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)
好吧,我的好奇心战胜了我。
从列表中创建一个对象 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)