【问题标题】:Concatenate nested list of array with partial empty sublist将嵌套的数组列表与部分空的子列表连接起来
【发布时间】:2021-12-31 10:48:48
【问题描述】:

目标是连接嵌套的数组列表(即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)

【问题讨论】:

  • 提供输入数据。
  • test2 和 test3 有什么问题。 test1 与 test2 相同。
  • 感谢@hpaulj。我同意 都是一样的,只是为了展示测试过的内容
  • 好的,我整理了你的代码(我不应该这样做),发现它会生成各种大小的嵌套列表。 np.array 生成带有参差不齐的警告的对象 dtype 数组。 vstack 失败,说尺寸不匹配。你应该告诉我们的!外部len 是6。下面有几层数组,还有一些[] 列表。这不能制成常规的 numpy 数组。我投票关闭

标签: python numpy concatenation


【解决方案1】:

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

从列表中创建一个对象 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)

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多