如何用长度未知的索引列表对任意维度的np.array进行指定切片?
解决方案:将索引列表转为元组进行多维索引
嘿,我完全懂你的需求啦!你想要的是把索引列表里的元素按顺序对应到数组的各个维度去取值,而不是把整个列表当成第一个维度的索引来用对吧?
问题根源
你提到的A[idx]之所以不符合预期,是因为在NumPy里,当你直接传入一个列表作为索引时,它会被解析为对第一个维度的花式索引——也就是取出第一个维度中索引为1和3的两个子数组,每个子数组形状是(4,5),所以最终得到的B_bad形状是(2,4,5),这显然不是你要的结果。
通用解决方法
只需要把你的索引列表转换成元组,再传入数组索引就可以了!代码如下:
import numpy as np A = np.zeros([3,4,5]) idx = [1,3] B = A[tuple(idx)] # 这就是你要的通用写法! print(B.shape) # 输出 (5),和手动写A[1,3]的结果一致
这个方法完全通用:
- 不管数组
A的维度n是多少,也不管索引列表的长度l(只要l<=n)都能生效 - 如果
l=1,比如idx=[2],B的形状就是(4,5),对应取第一个维度的第2个子数组 - 如果
l=3(和数组维度一致),B就是一个标量值
补充说明
NumPy的数组索引系统中,元组会被解析为多维度的索引参数,而列表则会被当成单维度的花式索引。所以把列表转成元组,就相当于把idx里的元素逐个传入A的索引位置,和你手动写A[idx[0], idx[1]]的效果完全一样,但写法更通用灵活。
内容的提问来源于stack exchange,提问作者Faur
相关产品推荐
相关产品推荐

