在 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