Python三维数组的列表推导式

3

我有一个三维数组,格式如下:

x = [
    [[1,2,3,4,5],[6,7,8,9,10]],
[[11,12,13,14,15],[16,17,18,19,20]],
[[21,22,23,24,25],[26,27,28,29,30]],
[[21,22,23,24,25]]
]

我想将它分成两个三维数组,格式如下:

y = [
    [[1,2,3],[6,7,8]],
[[11,12,13],[16,17,18]],
[[21,22,23],[26,27,28]],
[[21,22,23]]
]

z = [
    [[4,5],[9,10]],
[[14,15],[19,20]],
[[24,25],[29,30]],
[[24,25]]
]

我想到了这个列表推导式来创建y:

[j[:3] for i in x for j in i]

这将返回:

[[1, 2, 3], [6, 7, 8], [11, 12, 13], [16, 17, 18], [21, 22, 23], [26, 27, 28], [31, 32, 33]]

但是正如您所看到的,它并没有保持相同的多维形状。有人有什么想法吗?


2
使用numpy(而不是列表推导式)可以吗? - Paul H
2
@PaulH 不确定在不规则列表上使用numpy是否更好。 - Moses Koledoye
@MosesKoledoye 当然。你必须用NaN填充它,这将把整数转换为浮点数,然后你就必须... - Paul H
2个回答

3
您需要更深一层地迭代:
x = [[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], [[11, 12, 13, 14, 15], [16, 17, 18, 19, 20]], [[21, 22, 23, 24, 25], [26, 27, 28, 29, 30]], [[21, 22, 23, 24, 25]]]
y = [[i[:3] for i in b] for b in x]
z = [[i[-2:] for i in b] for b in x]

输出:

[[[1, 2, 3], [6, 7, 8]], [[11, 12, 13], [16, 17, 18]], [[21, 22, 23], [26, 27, 28]], [[21, 22, 23]]]
[[[4, 5], [9, 10]], [[14, 15], [19, 20]], [[24, 25], [29, 30]], [[24, 25]]]

2
将最内层循环移入嵌套的推导式中,以便保留内部列表:
y = [[j[:3] for j in i] for i in x]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接