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



我有一个 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

这是一种预先分配 NumPy 数组然后复制数据的方法。假设您实际上不需要扩展ll,这应该比在创建a1之前将 0 三元组附加到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的每个成员的位置。

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

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

相关内容

  • 没有找到相关文章

最新更新