在 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