如何在numpy中获得子阵列

如何在numpy中获得子阵列,numpy,sub-array,Numpy,Sub Array,我有一个3d数组,我想得到一个以索引indx为中心的大小为(2n+1)的子数组。使用我可以使用的切片 y[slice(indx[0]-n,indx[0]+n+1),slice(indx[1]-n,indx[1]+n+1),slice(indx[2]-n,indx[2]+n+1)] 如果我想要每个维度都有不同的尺寸,那只会变得更难看。有没有更好的方法可以做到这一点。您不需要使用slice构造函数,除非您想存储slice对象供以后使用。相反,您可以简单地执行以下操作: y[indx[0]-n:in

我有一个3d数组,我想得到一个以索引indx为中心的大小为(2n+1)的子数组。使用我可以使用的切片

y[slice(indx[0]-n,indx[0]+n+1),slice(indx[1]-n,indx[1]+n+1),slice(indx[2]-n,indx[2]+n+1)]

如果我想要每个维度都有不同的尺寸,那只会变得更难看。有没有更好的方法可以做到这一点。

您不需要使用
slice
构造函数,除非您想存储slice对象供以后使用。相反,您可以简单地执行以下操作:

y[indx[0]-n:indx[0]+n+1, indx[1]-n:indx[1]+n+1, indx[2]-n:indx[2]+n+1]
如果要在不单独指定每个索引的情况下执行此操作,可以使用列表理解:

y[[slice(i-n, i+n+1) for i in indx]]

您可以创建numpy数组,用于索引到
3D数组的不同维度,然后使用创建索引映射,从而获得切片输出。
ix_uz
的好处在于它允许广播索引地图。可以找到更多关于这方面的信息。然后,可以为通用解决方案的每个维度指定不同的窗口大小。下面是带有示例输入数据的实现-

import numpy as np

A = np.random.randint(0,9,(17,18,16))  # Input array
indx = np.array([5,10,8])              # Pivot indices for each dim
N = [4,3,2]                            # Window sizes

# Arrays of start & stop indices
start = indx - N
stop = indx + N + 1

# Create indexing arrays for each dimension
xc = np.arange(start[0],stop[0])
yc = np.arange(start[1],stop[1])
zc = np.arange(start[2],stop[2])

# Create mesh from multiple arrays for use as indexing map 
# and thus get desired sliced output
Aout = A[np.ix_(xc,yc,zc)]
因此,对于具有窗口大小数组的给定数据,
N=[4,3,2]
,将显示
whos
信息-

In [318]: whos
Variable   Type       Data/Info
-------------------------------
A          ndarray    17x18x16: 4896 elems, type `int32`, 19584 bytes
Aout       ndarray    9x7x5: 315 elems, type `int32`, 1260 bytes

输出的
whos
信息,
Aout
似乎与预期的输出形状一致,输出形状必须是
2N+1

应该是逗号,而不是冒号y[[indx中i的切片(i-n,i+n+1)]。除此之外thanks@user3799584:谢谢,拼写错误修复了!