首页 > 解决方案 > Python 中的多级切片行为是否有任何规范?

问题描述

对于使用 Python 列表在多个级别上获取切片的行为是否有任何规范?例如,这是一个 4 x 5 x 3 的列表列表:

>>> a_4_by_5_by_3 = [[[(5*3*r + 3*c + p) for p in range(0,3)] for c in range(0,5)] for r in range(0,4)]
>>> a_4_by_5_by_3
[[[0, 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, 31, 32], [33, 34, 35], [36, 37, 38], [39, 40, 41], [42, 43, 44]], [[45, 46, 47], [48, 49, 50], [51, 52, 53], [54, 55, 56], [57, 58, 59]]]

如果你在第一维取一个双元素切片,在第二维取一个三元素切片,代码不会被拒绝,但第二维的切片似乎被忽略了:

>>> a_4_by_5_by_3[0:2][0:3]
[[[0, 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]]]

如果不忽略第二维中的切片,则每行将只有三个元素:

[[[0, 1, 2], [3, 4, 5], [6, 7, 8]], [[15, 16, 17], [18, 19, 20], [21, 22, 23]]]

这是已知的行为吗?我无法在官方 Python 文档中找到任何评论这种或另一种方式的内容。我正在使用 Python 3.6,这是值得的。

标签: python

解决方案


x = a_4_by_5_by_3[0:2][0:3]

基本上相当于

x = a_4_by_5_by_3[0:2]
x = x[0:3]

, 所以你最终得到一个长 2 个项目的切片,然后尝试切片到第三个项目,该项目被隐式限制为序列的长度。

如果您希望随意对多维矩阵进行切片,您可能希望将它们制作成 Numpy 数组,它具有非常有趣的索引操作


推荐阅读