NumPy 陣列複製與檢視詳解

小万哥丶發表於2024-05-13

NumPy 陣列的複製與檢視

NumPy 陣列的複製和檢視是兩種不同的方式來建立新陣列,它們之間存在著重要的區別。

複製

複製 會建立一個包含原始陣列相同元素的新陣列,但這兩個陣列擁有獨立的記憶體空間。這意味著對複製進行的任何更改都不會影響原始陣列,反之亦然。

建立副本可以使用以下方法:

arr.copy():建立一個新的陣列,該陣列包含與原始陣列相同元素的副本。
np.array(arr):將陣列轉換為新的 NumPy 陣列。
arr[:]:使用切片建立整個陣列的副本。

示例:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

# 建立副本
copy = arr.copy()

# 修改副本
copy[2] = 100

# 列印原始陣列和副本
print(arr)
print(copy)

輸出:

[ 1  2  3  4  5]
[ 1  2 100  4  5]

檢視

檢視 是對原始陣列資料的引用,不擁有獨立的記憶體空間。這意味著對檢視進行的任何更改都會直接反映在原始陣列中,反之亦然。

建立檢視可以使用以下方法:

arr.view():建立一個新的陣列,該陣列是原始陣列資料的檢視。
arr[start:end]:使用切片建立原始陣列的檢視。
arr.reshape():改變陣列的形狀,但不改變底層資料。

示例:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

# 建立檢視
view = arr.view()

# 修改檢視
view[2] = 100

# 列印原始陣列和檢視
print(arr)
print(view)

輸出:

[ 1  2 100  4  5]
[ 1  2 100  4  5]

檢查陣列是否擁有資料

我們可以使用 arr.base 屬性來檢查陣列是否擁有其資料。如果 arr.baseNone,則陣列擁有自己的資料,否則它是一個檢視。

示例:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

copy = arr.copy()
view = arr.view()

print(copy.base)  # None
print(view.base)  # <ndarray object at 0x00000222588287E0>

練習

使用以下程式碼建立陣列 arr

import numpy as np

arr = np.array([10, 20, 30, 40, 50])

並使用以下方法建立 arr 的副本:

arr.copy()
np.array(arr)
arr[:]

在每個方法之後,列印原始陣列和副本,並驗證它們是否相等。

在評論中分享您的程式碼和結果。

Sure, here is the requested Markdown formatted content:

獲取陣列的形狀

NumPy 陣列的形狀描述了陣列中元素的組織方式,並由包含每個維度中元素數量的元組表示。

獲取陣列形狀

可以使用 arr.shape 屬性獲取 NumPy 陣列的形狀。它返回一個元組,其中每個元素表示相應維度的長度。

示例:

import numpy as np

# 建立一個二維陣列
arr = np.array([[1, 2, 3], [4, 5, 6]])

# 獲取陣列形狀
print(arr.shape)

輸出:

(2, 3)

這意味著陣列包含 2 行和 3 列。

形狀元組的含義

形狀元組中的每個元素表示相應維度的長度。例如,如果形狀為 (2, 3, 4),則陣列具有:

2 個行
3 列
每個元素 4 個值

使用 ndmin 建立具有特定形狀的陣列

我們可以使用 ndmin 引數來建立具有指定形狀的新陣列,即使原始資料不具有該形狀。ndmin 引數指定要建立的最小維度數。如果原始資料具有比 ndmin 更高的維度,則形狀將保留。如果維度數不足,則將新增新維度,並用 1 填充元素。

示例:

import numpy as np

# 使用 ndmin=5 建立一個包含值 1,2,3,4 的向量
arr = np.array([1, 2, 3, 4], ndmin=5)

print(arr)
print(arr.shape)

輸出:

[[[[1 2 3 4]]]]
(1, 1, 1, 1, 4)

練習

建立以下形狀的 NumPy 陣列,並列印它們的形狀:

一個包含 10 個元素的一維陣列。
一個包含 5 行 4 列的二維陣列。
一個包含 2 x 3 x 2 的三維陣列。

在評論中分享您的程式碼和輸出。

最後

為了方便其他裝置和平臺的小夥伴觀看往期文章:

微信公眾號搜尋:Let us Coding,關注後即可獲取最新文章推送

看完如果覺得有幫助,歡迎點贊、收藏、關注

相關文章