在numpy数组中,从末端切取可变距离的更具python风格的方法

在numpy数组中,从末端切取可变距离的更具python风格的方法,python,numpy,multidimensional-array,slice,Python,Numpy,Multidimensional Array,Slice,我想知道是否有更好的方法从结尾开始编写数组裁剪/切片,但要采用编程方式。这意味着,裁剪尺寸实际上可以是0,我有多个维度,例如5D张量 以下是2D中的一个简单示例: #这只是为了获得一些虚拟数据 将numpy作为np导入 A=np.rand.rand(10,5) #简易标准案例: ix=1 iy=1 B=A[ix:-ix,iy:-iy]#这很有效 #现在是更棘手的情况,我正在寻找一种类似蟒蛇的方法。 iy=0 #使用上面的代码,不符合我的要求=>2nd dim==0 C1=A[ix:-ix,iy:

我想知道是否有更好的方法从结尾开始编写数组裁剪/切片,但要采用编程方式。这意味着,裁剪尺寸实际上可以是0,我有多个维度,例如5D张量

以下是2D中的一个简单示例:

#这只是为了获得一些虚拟数据
将numpy作为np导入
A=np.rand.rand(10,5)
#简易标准案例:
ix=1
iy=1
B=A[ix:-ix,iy:-iy]#这很有效
#现在是更棘手的情况,我正在寻找一种类似蟒蛇的方法。
iy=0
#使用上面的代码,不符合我的要求=>2nd dim==0
C1=A[ix:-ix,iy:-iy]
#下一行给出了我想要的结果,但是是硬编码的
C2=A[ix:-ix,:]
#下一行也给出了我想要的,但完全无法阅读
#对于实数变量名和多个维度
C3=A[ix:A.shape[0]-ix:iy:A.shape[1]-iy]
#numpy中是否有类似于Matlab的东西?
C4=A[ix:end ix,iy:end iy]
C5=A[ix:np.end-ix,iy:np.end-iy]

我知道2D看起来没那么糟糕,但是如果你有多个维度和真实的变量名,代码很容易出错。那么,在python中是否有类似于Matlab中的“end”的东西,或者其他更具python风格的方式呢?

没有
end
。您所能做的最好的事情就是在助手函数中完成:

def crop(arr, *crop_lengths):
    if len(crop_lengths) > arr.ndim:
        raise TypeError('Not enough dimensions to crop.')
    slices = [slice(i, axis_len-i) for (i, axis_len) in zip(crop_lengths, arr.shape)]
    return arr[tuple(slices)]
def s(k):
    return slice(None) if k==0 else slice(k, -k)

C1 = A [ s(ix) , s(iy) ]
用法示例:

ix = 1
iy = 0
cropped = crop(A, ix, iy)
您应该使用
切片(无)
。为了便于阅读,您可以将其包装在一个简单的函数中:

def crop(arr, *crop_lengths):
    if len(crop_lengths) > arr.ndim:
        raise TypeError('Not enough dimensions to crop.')
    slices = [slice(i, axis_len-i) for (i, axis_len) in zip(crop_lengths, arr.shape)]
    return arr[tuple(slices)]
def s(k):
    return slice(None) if k==0 else slice(k, -k)

C1 = A [ s(ix) , s(iy) ]

让助手句柄构建单个切片对象看起来比我选择的设计更简洁,但是您的(宽限期)编辑使
s(1,-0)
product
1:0
而不是
1:
@user2357112,为真。我已经把我的例子说得更具体了。显然,您的解决方案更通用。索引始终可以使用元组
x[idx]
完成。许多numpy函数从列表甚至数组构造这样的元组。还可以通过查看
np.lib.indextricks.py
来了解
np.r\u
np.ogrid
等对象背后的巧妙技巧。