在 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
的内存缓冲区上的某些位置。这就是使数组索引方法比仅仅创建一个新数组更好的原因。
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