如何利用起始与结束坐标提取NumPy 3D数组的子数组?
提取3D NumPy数组中长方体区域的子数组方法
嘿,这个问题用NumPy的切片特性就能轻松搞定,不过得先搞清楚一个核心规则:NumPy的数组切片是左闭右开区间,也就是arr[start:end]会包含start索引的元素,但不会包含end索引的元素。这点直接决定了我们怎么写切片范围。
具体操作步骤
假设你的3D数组名叫arr,已经用numpy.random.rand(100, 100, 100)或者其他方式创建好了:
- 先明确需求:如果要包含起始坐标(0,0,0)和结束坐标(50,20,20)这两个顶点的所有元素,那每个维度的结束切片值需要加1。因为切片到
51的时候,实际会取到索引0到50的元素,刚好包含目标结束点。 - 直接使用三维切片提取子数组:
import numpy as np # 创建100×100×100的3D数组 arr = np.random.rand(100, 100, 100) # 提取包含(0,0,0)到(50,20,20)的长方体区域 sub_arr = arr[0:51, 0:21, 0:21] # 验证子数组形状,应该是(51, 21, 21) print(sub_arr.shape) # 输出 (51, 21, 21)
通用写法
如果你的起始坐标是(x1, y1, z1),结束坐标是(x2, y2, z2),并且需要包含这两个顶点,通用的提取代码就是:
sub_arr = arr[x1:x2+1, y1:y2+1, z1:z2+1]
要是你本来就不想包含结束坐标的元素,那直接去掉+1就行,比如arr[0:50, 0:20, 0:20],不过这种情况在“两个顶点定义长方体”的场景里比较少见~
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

