有很多关于切片2D和3D NumPy数组的文章,但是在我的程序中,数组的尺寸未知。考虑任意尺寸为A
(正整数)的NumPy ndarray n
,形状为D=[d1,...,dn]
(di
是非负整数),例如:
import numpy as np
D=np.array([2,3,4,5])
A=np.random.rand(*D)
现在,我需要提取一个A
的块,从D1=[d11,...,d1n]
到D2=[d21,...,d2n]
,对于所有0<i<=n : 0<=d1i<=d2i<=di
而言。像这样:
A[D1:D2]
如果我新建了n
,那么我可以简单地使用A[d11:d21,...,d1i:d2i,...,d1n:d2n]
,但事实并非如此。如果您可以帮助我了解在给定A
和D1
的情况下裁剪D2
的最有效方法,我将不胜感激。
答案 0 :(得分:1)
@Joe所指的numpy indexing page部分可能是这样的:
注意
请记住,切片元组始终可以构造为obj 并以x[obj]
表示法使用。切片对象可用于 构造来代替[start:stop:step]
表示法。例如,x[1:10:5,::-1]
也可以实现为:
obj = (slice(1,10,5), slice(None,None,-1))
x[obj]
适用于任意维数组的通用代码。
使用此概念,您应该能够提前构建切片的元组,然后将其应用于A
。
obj = tuple(slice(D1[i], D2[i]) for i in range(D1.shape[0]))
A[obj]
请注意*这实际上并没有使用高级索引,因为您仍在提供切片对象的元组,这与使用以冒号和逗号分隔的切片的手法/功能等效:A[d11:d21, ...
高级索引使用的数组不同的数据类型,而不是slice
对象的唯一元组。