Python中非齐次2D list采用numpy风格[:, -1:]切片报错的原因
问题原因解答
核心差异在于两种对象的索引实现逻辑完全不同:
- 原生Python列表的索引规则限制
Python列表本质是一维可变容器,它的__getitem__魔术方法只接收单个参数。当你写l[:, -1:]时,Python解释器会自动把逗号左右的两个切片打包成一个元组(slice(None), slice(-1, None))作为入参传给列表的索引方法,而原生列表的设计里只允许索引是整数或者切片类型,不接受元组作为入参,所以直接触发类型错误。 - NumPy数组的多维度索引适配
NumPy的核心设计就是支持高维数组运算,因此它重写了数组对象的__getitem__方法,专门兼容逗号分隔的多维度索引语法:当传入由逗号分隔的多个索引/切片时,NumPy会自动将每个参数对应到数组的对应维度分别做索引计算,所以你写的a[:, -1:]会被正确解析为「取第一维所有元素,每个元素再取最后1个位置的值」,可以正常输出结果。
如果要在原生列表上实现相同效果,需要手动遍历实现,示例代码如下:
res = [[item[-1]] for item in l] print(res) # 输出:[[3], [6]]
内容的提问来源于stack exchange,提问作者Paul Jurczak
相关产品推荐
相关产品推荐

