【问题标题】:fill missing values in 3D list with zeros to create 3D numpy array用零填充 3D 列表中的缺失值以创建 3D numpy 数组
【发布时间】:2019-12-18 12:29:21
【问题描述】:

我有一个 3D 列表 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)

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]]
])

我已阅读以下内容,但它们是 2D 的,我无法为 3D 做。

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

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

【问题讨论】:

  • 我不明白你的问题。你能更精确一点吗?为什么不直接添加缺失的零?
  • 最里面的列表也是可变长度的吗?还是它们总是包含三个元素?
  • 它们是坐标,所以总是有 3 个元素。
  • ll[len(ll) - 1].append([0, 0, 0]) 你是这个意思吗?
  • @IcesHay 我认为这个想法是让一些更通用的工作,即当你不知道需要填充多少个零以及在哪里填充时。

标签: python itertools numpy-ndarray


【解决方案1】:

这是一种预先分配 NumPy 数组然后复制数据的方法。假设您实际上不需要扩展的ll,这应该比在创建a1 之前将0-triples 附加到ll 使用更少的内存:

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

【讨论】:

    【解决方案2】:

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

    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])
    
    

    【讨论】:

    • 好方法,但max 已经是 Python 中的函数名称,所以最好不要将它重用于变量名称。您可以执行m = max([len(k) for k in ll]) 之类的操作,将答案的第一部分变成更 Pythonic 的内容
    • 你是对的。我会更新我的答案。感谢您的反馈。
    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2019-11-24
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    相关资源
    最近更新 更多