我们可以使用
slicing
为此:我们可以指定第二和第三维度的范围,如:
sub_img = img_arr[:, :12, :12 , :]
然后
sub_img.shape == (10000, 12, 12, 3)
. 因此,我们在此指定
0
到
12
(但我们不需要明确说明
0
). 我们这样做是为了第二和第三维度。它也是一种声明性语言:我们构造一个
sub_img
其中第一个索引占全部(
:
),第二项至第十二项(
:12
)等。
注意,我们不需要指定拖尾
:
s、 我们还可以写:
sub_img = img_arr[:, :12, :12] # no last ":"
切片为视图
请注意,我们在这里
构造视图
,我们有
不
复制数组,我们只构建一个视图。所以如果我们在
img_arr
在视图范围内,我们可以在
sub\u img
,反之亦然。如果需要副本,可以通过
array
建造商:
sub_img = np.array(img_arr[:, :12, :12]) # making a copy, instead of a view
然而,使用视图可能是有益的,因为它几乎不使用内存来存储视图(这里大约144字节,而副本大约需要34 MB),而且视图的构造几乎是即时的(通常它会随着
尺寸数量
),而副本将随图元的数量而缩放。
任意数量的维度使用
slice
物体
例如,如果维度的数量是任意的,我们还可以传递
片
物体。
例如,第一个表达式等效于:
# equivalent to the first code fragment
indices = (slice(None), slice(12), slice(12))
sub_img = img_arr[indices]
因此,如果维数是任意的,我们可以首先构造这样的元组。例如,除了第一个和最后一个维度之外,将所有维度切片为12的元组是:
# generalized with arbitrary number of dimensions
indices = (slice(None), *(slice(12) for _ in range(img_arr.ndim - 2)))
sub_img = img_arr[indices]