Python 从NumPy数组的中间剪切子集

Python 从NumPy数组的中间剪切子集,python,numpy,Python,Numpy,我使用光栅图像和模块rasterio,将它们改进为numpy阵列。我想从每幅图像的中间剪出一部分大小(10001000)(以避免图像的外边界遮罩) image=np.random.random_样本((20002000)) s=图像.shape mid=[s中x的圆形(x/2)#两个轴的中点 边距=[[y+x代表y在[-500500]]代表x在中间]#围绕每个中间点的1000范围 结果是一个包含两个列表的列表,用于每个轴上的切割范围。但这就是我要说的:range()不接受列表,我正在尝试以下暴

我使用光栅图像和模块
rasterio
,将它们改进为
numpy
阵列。我想从每幅图像的中间剪出一部分大小
(10001000)
(以避免图像的外边界遮罩)

image=np.random.random_样本((20002000))
s=图像.shape
mid=[s中x的圆形(x/2)#两个轴的中点
边距=[[y+x代表y在[-500500]]代表x在中间]#围绕每个中间点的1000范围
结果是一个包含两个列表的列表,用于每个轴上的切割范围。但这就是我要说的:
range()
不接受列表,我正在尝试以下暴力方法:

cut_image=image[范围(边距[0][0],边距[0][1]),范围(边距[1][0],边距[1][1])]
但是:

cut_image.shape
## (1000,)
切片数组会丢失维度信息,这正是我不想要的。 把我弄糊涂了。
正在寻找一个更有品味的解决方案。

这里的问题是,您所做的是整数索引,而不是切片索引。巴哈维奥人会改变,如果不熟悉它,可能会显得违反直觉。您可以查看以了解更多详细信息

以下是使用基本切片的方法:

# center coordinates of the image
x_0, y_0 = np.asarray(image.shape)//2
# slice taken from the center point
out = image[x_0-x_0//2:x_0+x_0//2, y_0-y_0//2:y_0+y_0//2]

print(out.shape)
# (1000, 1000)

正如另一个答案所指出的,您并不是真正地对数组进行切片,而是对其使用索引

如果您想对数组进行切片(没错,这比使用索引列表更优雅),那么使用切片会更愉快。该对象表示
start:end:step
语法

就你而言

将numpy导入为np
WND=50
image=np.random.random_样本((200300))
s=图像.shape
mid=[s中x的圆形(x/2)#两个轴的中点
边距=[[y+x表示y在[-WND,WND]]表示x在中间]#每个中间点周围有1000个范围
#数组[切片(开始,结束)]->数组[开始:结束]
x_切片=切片(页边距[0][0],页边距[0][1])
y_切片=切片(页边距[1][0],页边距[1][1])
打印(x_切片,y_切片)
#切片(50150,无)切片(100200,无)
剪切图像=图像[x\U切片,y\U切片]
打印(剪切图像.形状)
# (100,100)
索引? 您可能想知道在您的问题中发生了什么,导致只有1000个元素,而不是预期的1000*1000

下面是一个使用不同维度的列表进行索引的简单示例

# n and n2 have identical values
n = a[[i0, i1, i2],[j0, j1, j2]]
n2 = np.array([a[i0, j0], a[i1, j1], a[i2, j2]]

澄清了这一点,您就会明白,您的代码不是采用块矩阵,而是只返回该块矩阵的对角系数:)

哦,它是有效的!但是为什么使用
会保留维度,而使用
range()
会丢失维度?因为您所做的是整数索引,而不是切片索引。行为改变了。检查文档谢谢您提供详细的示例和解释!