裁剪给定两个角的任意维度的NumPy数组

时间:2018-08-10 14:17:47

标签: python numpy

有很多关于切片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],但事实并非如此。如果您可以帮助我了解在给定AD1的情况下裁剪D2的最有效方法,我将不胜感激。

1 个答案:

答案 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对象的唯一元组。