在 NumPy 中切片 2D 数组

Muhammad Maisam Abbas 2023年1月30日
  1. 在 NumPy 中使用数组索引切片 2D 数组
  2. 使用 NumPy 中的 numpy.ix_() 函数对二维数组进行切片
在 NumPy 中切片 2D 数组

本教程将介绍如何在 NumPy 中对二维数组进行切片。

在 NumPy 中使用数组索引切片 2D 数组

如果我们有一个主要的 2D NumPy 数组,并且想要从中提取另一个 2D 子数组,我们可以为此使用数组索引方法。让我们在这个例子中使用一个 4*4 形状的数组。提取数组的第一个和最后一个元素非常简单。例如,array[0:2,0:2] 会给我们一个视图或子数组,其中包含数组中垂直和水平的前两个元素。类似地,array[2:,2:] 会给我们一个视图或子数组,其中包含数组中垂直和水平的最后两个元素。更复杂的工作是通过跳过中间的行或列从不同的行和列中获取元素。下面的代码示例向我们展示了如何使用 Python 中的数组索引来实现这一点。

import numpy as np

x = range(16)

x = np.reshape(x, (4, 4))
print(x)

y = x[[[0], [2]], [1, 3]]
print(y)

输出:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
[[ 1  3]
 [ 9 11]]

在上面的代码中,我们提取了第 1 行和第 3 行中与第 1 列和第 3 列相交的元素,同时使用 Python 中的数组索引方法跳过了第 2 行和第 2 列。这也可以使用类似的方法来完成,但使用一些不同的语法,如下面的编码示例所示。

import numpy as np

x = range(16)

x = np.reshape(x, (4, 4))
print(x)

y = x[0::2, 1::2]
print(y)

输出:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
[[ 1  3]
 [ 9 11]]

在上面的代码中,我们还提取了第 1 行和第 3 行中与第 1 列和第 3 列相交的元素,同时使用 Python 中的数组索引方法跳过了第 2 行和第 2 列。这种方法比以前的方法更容易,因为它不涉及太多括号,整体可读性更强。

使用 NumPy 中的 numpy.ix_() 函数对二维数组进行切片

numpy.ix_() 函数在 Python 中形成一个开放的网格形式的元素序列。此函数接受 n 个一维数组并返回一个 nD 数组。我们可以使用这个函数从我们的主数组中提取单独的一维切片,然后将它们组合成一个二维数组。下面的代码示例与前面的示例执行相同的工作,但使用 numpy.ix_() 函数和 Python 中的数组索引。

import numpy as np

x = range(16)

x = np.reshape(x, (4, 4))
print(x)

y = x[np.ix_([0, 2], [1, 3])]
print(y)

输出:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
[[ 1  3]
 [ 9 11]]

在上面的代码中,我们基本上做了与前面的例子完全相同的事情,但是使用了 np.ix_() 函数以及 Python 中的数组索引。

所有这些示例背后的主要思想是相同的。当我们创建主数组时,会根据其形状和大小为其分配一个缓冲区。数组索引方法创建一个数组数据类型的新对象,该对象指向我们主数组的内存缓冲区。在上述所有示例中,尽管 y 是一个新数组,但它不占用内存中的任何缓冲区。它只指向数组 x 的内存缓冲区上的某些位置。这就是使数组索引方法比仅仅创建一个新数组更好的原因。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn