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)))
,这可能会更好一些(实际上我想我会更新答案来使用它)。