用零填充3D列表中的缺失值以创建3D numpy数组

时间:2019-12-18 12:29:21

标签: python itertools numpy-ndarray

我有一个3D列表O(1),其大小可以为O(∞)

ll

我希望它成为

100 K * 10 * 3

以便我可以创建ll = [ [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10,11,12]], [[6, 7, 8],[12, 13, 14]], [[10, 20, 30], [40, 50, 60], [70, 80, 90]] ]

ll = [[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10,11,12]], [[6, 7, 8],[12, 13, 14], [0, 0, 0], [0, 0, 0]], [[10, 20, 30], [40, 50, 60], [70, 80, 90], [0,0,0]]]

a1 = np.array(l1)

我已经阅读了以下内容,但它们适用于2D,但我无法做到3D。

https://stackoverflow.com/a/38619333/5202279

https://stackoverflow.com/a/43149308/5202279

2 个答案:

答案 0 :(得分:2)

这是一种先分配NumPy数组,然后复制数据的方法。假设您实际上并不需要扩展的ll,则与在创建a1之前将0-三元组附加到a1 = np.zeros((len(ll), max([len(k) for k in ll]), 3)) for ctr,k in enumerate(ll): a1[ctr,:len(k),:] = k a1 array([[[ 1., 2., 3.], [ 4., 5., 6.], [ 7., 8., 9.], [10., 11., 12.]], [[ 6., 7., 8.], [12., 13., 14.], [ 0., 0., 0.], [ 0., 0., 0.]], [[10., 20., 30.], [40., 50., 60.], [70., 80., 90.], [ 0., 0., 0.]]]) 相比,这将使用更少的内存:

max([len(k) for k in ll])

ll告诉我们a1中任何成员的最大三元组数。我们分配所需大小的0初始化的NumPy数组。然后在循环中,智能索引会告诉我们在ll中的哪个位置复制str的每个成员。

答案 1 :(得分:1)

遍历列表中的所有元素,这些元素也是列表,并获得最大长度。然后将零添加到每个没有最大长度的“子列表”。

m = max([len(k) for k in ll])

for i in range(0, len(ll)):
    while len(ll[i]) < m:
        ll[i].append([0, 0, 0])