Python 使用切片列表索引numpy数组

Python 使用切片列表索引numpy数组,python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,我有一个切片的列表,并使用它们来索引numpy数组 arr=np.arange(25)。重塑(5,5) #数组([[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]]) slice_list=list(映射(lambda i:slice(i,i+2),[1,2])) #[切片(1

我有一个
切片的列表
,并使用它们来索引
numpy
数组

arr=np.arange(25)。重塑(5,5)
#数组([[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]])
slice_list=list(映射(lambda i:slice(i,i+2),[1,2]))
#[切片(1,3,无),切片(2,4,无)]
打印(arr[切片列表])
#==arr[1:3,2:4]
# [[ 7  8]
#  [12 13]]
这很好,但如果切片数少于维度数,则会中断 我要索引的数组的

arr3d = arr[np.newaxis, :, :]  # dims: [1, 5, 5]
arr3d[:, slice_list]
# IndexError: only integers, slices (`:`), ellipsis (`...`),(`None`) 
#  numpy.newaxis and integer or boolean arrays are valid indices
但是,以下示例有效:

arr3d[:, slice_list[0], slice_list[1]]
arr3d[[slice(None)] + slice_list]
arr3d[:, [[1], [2]], [2, 3]]
是否有一种方法可以使用切片列表为具有更多维度的数组编制索引。 我想做以下事情:

arr[..., slice_list]
arr[..., slice_list, :]
arr[:, slice_list, :]
不考虑数组的尺寸,不计算有多少个
[切片(无)]*X

我必须在我的
slice\u列表的任一侧进行填充

您可以使用切片元组和省略号对象进行填充。只需将要用于索引的所有元素放入一个元组,并将其用作索引:

将numpy导入为np
arr=np.arange(24)。重塑(2,3,4)
打印(arr)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
# 
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]
slice\u tup=tuple(map(lambda i:slice(i,i+2),[1,2]))
打印(切片)
#(切片(1,3,无),切片(2,4,无))
打印(arr[slice\u tup])
# [[[20 21 22 23]]]
#arr[…,切片列表]
打印(arr[(省略号,*切片)])
# [[[ 6  7]
#   [10 11]]
# 
#  [[18 19]
#   [22 23]]]
#arr[…,切片列表,:]
打印(arr[(省略号,*切片,切片(无)))
# [[[20 21 22 23]]]
#arr[:,切片列表,:]
打印(arr[(切片(无),*切片,切片(无)))
#索引器:数组的索引太多

@user3483203太棒了!好的,但是我必须组合列表/元组,我不能直接使用
arr[…,slice\u tuple,:]
?@No,因为这与
arr[(省略号,(slice(1,3,None),slice(2,4,None)),slice(None))]
(即嵌套元组)相同。对于这些情况,最好像函数调用一样使用
*
解包语法,这样您就可以执行类似于
arr[…,*slice\u tup,:]
的操作,但目前不允许这样做(公平地说,这是一种极端情况)。但是你可以做
打印(arr[(省略号,*slice\u tup,slice(None)))
,这可能会更好一些(实际上我想我会更新答案来使用它)。