1. NumPy簡(jiǎn)介
NumPy是Python中一個(gè)重要的庫,用于科學(xué)計(jì)算和數(shù)據(jù)分析。它提供了一個(gè)強(qiáng)大的多維數(shù)組對(duì)象(ndarray)和用于操作這些數(shù)組的函數(shù)。NumPy是許多其他Python科學(xué)計(jì)算庫的基礎(chǔ),如Pandas、SciPy和Matplotlib。
NumPy的背景和目標(biāo)
NumPy最初由Travis Olliphant于2005年創(chuàng)建,并且它是Numeric和Numarray兩個(gè)庫的繼承者。NumPy的目標(biāo)是為Python提供一種高效的數(shù)組處理方法,使得科學(xué)計(jì)算更加便捷和高效。
NumPy的主要特征和應(yīng)用場(chǎng)景
NumPy的主要特征包括:
-
強(qiáng)大的多維數(shù)組對(duì)象:NumPy的核心是
ndarray對(duì)象,它可以存儲(chǔ)任意維度的同類型數(shù)據(jù)。這種數(shù)組對(duì)象非常適合進(jìn)行數(shù)值計(jì)算和數(shù)據(jù)處理。 - 快速的數(shù)值運(yùn)算:NumPy通過對(duì)數(shù)組的操作使用高效的C語言代碼實(shí)現(xiàn),因此在數(shù)值運(yùn)算方面比純Python代碼更快速。
- 廣播機(jī)制:NumPy引入了廣播機(jī)制,使得不同形狀的數(shù)組可以進(jìn)行運(yùn)算,這樣可以簡(jiǎn)化代碼并提高運(yùn)算效率。
- 豐富的數(shù)學(xué)函數(shù)庫:NumPy提供了大量的數(shù)學(xué)函數(shù)和線性代數(shù)操作,如三角函數(shù)、指數(shù)函數(shù)、統(tǒng)計(jì)函數(shù)、矩陣分解等,滿足科學(xué)計(jì)算的需求。
- 與其他科學(xué)計(jì)算庫的兼容性:NumPy與其他常用的科學(xué)計(jì)算庫(如SciPy、Pandas、Matplotlib)緊密結(jié)合,可以方便地與這些庫一起使用。
NumPy在以下應(yīng)用場(chǎng)景中得到廣泛應(yīng)用:
- 數(shù)據(jù)分析和處理:NumPy的數(shù)組對(duì)象提供了高效的數(shù)據(jù)結(jié)構(gòu)和操作,使得數(shù)據(jù)分析和處理變得更加便捷。它可以處理大量數(shù)據(jù)并進(jìn)行快速的數(shù)值計(jì)算。
- 科學(xué)計(jì)算:NumPy提供了豐富的數(shù)學(xué)函數(shù)和線性代數(shù)操作,適用于科學(xué)計(jì)算中的各種任務(wù),如信號(hào)處理、圖像處理、統(tǒng)計(jì)分析等。
- 機(jī)器學(xué)習(xí)和人工智能:NumPy是許多機(jī)器學(xué)習(xí)和深度學(xué)習(xí)框架的基礎(chǔ)。它提供了高效的數(shù)組操作和數(shù)學(xué)函數(shù),可以加速算法的實(shí)現(xiàn)和運(yùn)行。
NumPy與Python的關(guān)系
NumPy是用Python編寫的,是Python科學(xué)計(jì)算生態(tài)系統(tǒng)中的核心組件之一。NumPy提供了高性能的數(shù)組對(duì)象和數(shù)組操作函數(shù),使得Python在科學(xué)計(jì)算領(lǐng)域有了更強(qiáng)大的能力。
NumPy通過底層的C語言代碼實(shí)現(xiàn)了數(shù)組操作的高效性,并通過Python的接口與用戶進(jìn)行交互。這使得NumPy既具有高性能的計(jì)算能力,又保持了Python的簡(jiǎn)潔和易用性。
NumPy還與Python的標(biāo)準(zhǔn)庫和其他科學(xué)計(jì)算庫緊密結(jié)合,使得用戶可以方便地進(jìn)行數(shù)據(jù)的讀寫、可視化和分析。通過NumPy,Python成為了一種強(qiáng)大的科學(xué)計(jì)算語言,受到了廣泛的應(yīng)用和開發(fā)者的喜愛。
2. NumPy數(shù)組
NumPy的核心是多維數(shù)組對(duì)象ndarray,它提供了一種高效存儲(chǔ)和操作大量數(shù)據(jù)的方式。在本節(jié)中,我們將學(xué)習(xí)如何創(chuàng)建NumPy數(shù)組,了解數(shù)組的屬性和方法,并掌握基本的數(shù)組操作。
創(chuàng)建NumPy數(shù)組
NumPy數(shù)組可以通過多種方式創(chuàng)建,如以下示例所示:
通過Python列表創(chuàng)建數(shù)組
import numpy as np
# 創(chuàng)建一維數(shù)組
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)
# [1 2 3 4 5]
# 創(chuàng)建二維數(shù)組
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
# [[1 2 3]
# [4 5 6]]
使用NumPy函數(shù)創(chuàng)建特殊數(shù)組
# 創(chuàng)建全零數(shù)組
zeros = np.zeros((2, 3))
print(zeros)
# [[0. 0. 0.]
# [0. 0. 0.]]
# 創(chuàng)建全一數(shù)組
ones = np.ones((3, 2))
print(ones)
# [[1. 1.]
# [1. 1.]
# [1. 1.]]
# 創(chuàng)建指定范圍的等間隔數(shù)組
range_arr = np.arange(0, 10, 2)
print(range_arr)
# [0 2 4 6 8]
# 創(chuàng)建指定大小的隨機(jī)數(shù)組
random_arr = np.random.rand(2, 3)
print(random_arr)
# [[0.98409252 0.27752055 0.89984634]
# [0.00264179 0.62695002 0.77690454]]
數(shù)組的屬性和方法
NumPy數(shù)組具有許多有用的屬性和方法,可以幫助我們了解和操作數(shù)組。以下是一些常用的屬性和方法:
數(shù)組的形狀和維度
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # 輸出數(shù)組的形狀
# (2, 3)
print(arr.ndim) # 輸出數(shù)組的維度
# 2
數(shù)組的數(shù)據(jù)類型
arr = np.array([1, 2, 3])
print(arr.dtype) # 輸出數(shù)組的數(shù)據(jù)類型
# int32
數(shù)組的大小和元素個(gè)數(shù)
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.size) # 輸出數(shù)組的大小,即元素的總個(gè)數(shù)
# 6
print(arr.itemsize) # 輸出數(shù)組中每個(gè)元素的字節(jié)大小
# 4
操作數(shù)組的基本操作
數(shù)組的索引和切片
arr = np.array([1, 2, 3, 4, 5])
print(arr[0]) # 輸出第一個(gè)元素
# 1
print(arr[2:4]) # 輸出索引為2和3的元素
# [3 4]
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr[1, 2]) # 輸出第二行第三列的元素
# 6
print(arr[:, 1]) # 輸出所有行的第二列元素
# [2 5]
數(shù)組的變形
arr = np.array([1, 2, 3, 4, 5, 6])
# [1 2 3 4 5 6]
reshaped_arr = arr.reshape(2, 3) # 將一維數(shù)組變形為二維數(shù)組
print(reshaped_arr)
# [[1 2 3]
# [4 5 6]]
arr = np.array([[1, 2], [3, 4]])
# [[1 2]
# [3 4]]
flattened_arr = arr.flatten() # 將二維數(shù)組展平為一維數(shù)組
print(flattened_arr)
# [1 2 3 4]
數(shù)組的拼接
arr1 = np.array([1, 2, 3])
# [1 2 3]
arr2 = np.array([4, 5, 6])
# [4 5 6]
concatenated_arr = np.concatenate((arr1, arr2)) # 拼接兩個(gè)數(shù)組
print(concatenated_arr)
# [1 2 3 4 5 6]
arr1 = np.array([[1, 2], [3, 4]])
# [[1 2]
# [3 4]]
arr2 = np.array([[5, 6]])
# [[5 6]]
concatenated_arr = np.concatenate((arr1, arr2), axis=0) # 沿行方向拼接
print(concatenated_arr)
# [[1 2]
# [3 4]
# [5 6]]
3. NumPy數(shù)據(jù)類型
NumPy提供了多種數(shù)據(jù)類型來存儲(chǔ)和處理數(shù)組中的元素。在本節(jié)中,我們將學(xué)習(xí)常見的數(shù)據(jù)類型、數(shù)據(jù)類型轉(zhuǎn)換以及如何自定義數(shù)據(jù)類型。
常見的數(shù)據(jù)類型
NumPy支持以下常見的數(shù)據(jù)類型:
-
bool:布爾值(True或False) -
int:整數(shù)類型,根據(jù)平臺(tái)可能是int32或int64 -
float:浮點(diǎn)數(shù)類型,根據(jù)平臺(tái)可能是float32或float64 -
complex:復(fù)數(shù)類型,由兩個(gè)浮點(diǎn)數(shù)表示實(shí)部和虛部 -
str:字符串類型 -
object:Python對(duì)象類型 -
datetime:日期時(shí)間類型 -
timedelta:時(shí)間間隔類型 -
np.void:Void類型,可以存儲(chǔ)任意類型的數(shù)據(jù)
數(shù)據(jù)類型轉(zhuǎn)換
在NumPy中,可以使用astype()函數(shù)進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。以下是一些常見的數(shù)據(jù)類型轉(zhuǎn)換示例:
arr = np.array([1, 2, 3])
# [1 2 3]
# 轉(zhuǎn)換為浮點(diǎn)數(shù)類型
float_arr = arr.astype(float)
print(float_arr)
# [1. 2. 3.]
# 轉(zhuǎn)換為字符串類型
str_arr = arr.astype(str)
print(str_arr)
# ['1' '2' '3']
# 轉(zhuǎn)換為布爾類型
bool_arr = arr.astype(bool)
print(bool_arr)
# [ True True True]
自定義數(shù)據(jù)類型
NumPy還允許用戶自定義數(shù)據(jù)類型,以滿足特定的需求。可以使用np.dtype()函數(shù)來定義自定義數(shù)據(jù)類型,并指定字段的名稱和數(shù)據(jù)類型。以下是一個(gè)自定義數(shù)據(jù)類型的示例:
- 對(duì)于定義的自定義數(shù)據(jù)類型,其中的字符串字段需要指定字符串的最大長(zhǎng)度
- 未指定字符串字段的最大長(zhǎng)度,則默認(rèn)為長(zhǎng)度為0的空字符串,導(dǎo)致相關(guān)字段為空
-
'U10'表示最大長(zhǎng)度為10的Unicode字符串
# 定義自定義數(shù)據(jù)類型
person_dtype = np.dtype([('name', 'U10'), ('age', 'int'), ('height', 'float')])
# 創(chuàng)建一個(gè)數(shù)組并使用自定義數(shù)據(jù)類型
person_arr = np.array([('John', 25, 180.5), ('Alice', 30, 165.2)], dtype=person_dtype)
print(person_arr)
# [('John', 25, 180.5) ('Alice', 30, 165.2)]
print(person_arr[0]['name'])
# John
4. 數(shù)組計(jì)算
NumPy提供了豐富的數(shù)組計(jì)算方法、廣播機(jī)制以及數(shù)學(xué)函數(shù)和線性代數(shù)操作,使得處理和操作數(shù)組變得更加便捷和高效。
數(shù)組的計(jì)算方法
使用NumPy,你可以對(duì)數(shù)組進(jìn)行各種數(shù)學(xué)運(yùn)算和統(tǒng)計(jì)計(jì)算。以下是一些常用的數(shù)組計(jì)算方法示例:
-
np.sum(arr):計(jì)算數(shù)組所有元素的總和。 -
np.mean(arr):計(jì)算數(shù)組所有元素的平均值。 -
np.std(arr):計(jì)算數(shù)組所有元素的標(biāo)準(zhǔn)差。 -
np.var(arr):計(jì)算數(shù)組所有元素的方差。 -
np.min(arr):找到數(shù)組中的最小值。 -
np.max(arr):找到數(shù)組中的最大值。 -
np.argmin(arr):找到數(shù)組中最小值的索引。 -
np.argmax(arr):找到數(shù)組中最大值的索引。
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([6, 7, 8, 9, 10])
# 計(jì)算數(shù)組總和
sum_result = np.sum(arr1)
print("數(shù)組總和:", sum_result)
# 數(shù)組總和: 15
# 計(jì)算數(shù)組平均值
mean_result = np.mean(arr1)
print("數(shù)組平均值:", mean_result)
# 數(shù)組平均值: 3.0
# 計(jì)算數(shù)組標(biāo)準(zhǔn)差
std_result = np.std(arr1)
print("數(shù)組標(biāo)準(zhǔn)差:", std_result)
# 數(shù)組標(biāo)準(zhǔn)差: 1.4142135623730951
# 計(jì)算數(shù)組最大值
max_result = np.max(arr1)
print("數(shù)組最大值:", max_result)
# 數(shù)組最大值: 5
廣播機(jī)制
廣播機(jī)制(Broadcasting)是NumPy中一種強(qiáng)大且靈活的功能,它允許不同形狀的數(shù)組在進(jìn)行元素級(jí)別的運(yùn)算時(shí)自動(dòng)調(diào)整形狀,以滿足運(yùn)算的要求。廣播機(jī)制可以簡(jiǎn)化代碼并提高計(jì)算的效率。
廣播機(jī)制的核心原則是在進(jìn)行運(yùn)算時(shí),NumPy會(huì)自動(dòng)調(diào)整數(shù)組的形狀,使其能夠逐元素地進(jìn)行計(jì)算。具體來說,廣播機(jī)制會(huì)按照以下規(guī)則進(jìn)行數(shù)組的形狀調(diào)整:
- 如果兩個(gè)數(shù)組的維度數(shù)不同,那么在較小的維度上
添加長(zhǎng)度為1的維度,直到兩個(gè)數(shù)組的維度數(shù)相同。
a. 維度數(shù)(number of dimensions)是指數(shù)組的維度或軸的數(shù)量。在NumPy中,數(shù)組的維度數(shù)可以通過ndim屬性獲取
b. 長(zhǎng)度為1的維度指的是在數(shù)組的形狀中,某個(gè)維度的長(zhǎng)度(即元素個(gè)數(shù))為1
# 創(chuàng)建示例數(shù)組
arr1 = np.array([1, 2, 3]) # 形狀為 (3,)
# [1 2 3]
arr2 = np.array([[4], [5], [6]]) # 形狀為 (3, 1)
# [[4]
# [5]
# [6]]
# 在較小維度上添加長(zhǎng)度為1的維度,使維度數(shù)相同
broadcasted_arr1 = arr1[:, np.newaxis] # 添加維度后的形狀為 (3, 1)
print("調(diào)整后的數(shù)組形狀:")
print(broadcasted_arr1)
# [[1]
# [2]
# [3]]
print(arr2)
# [[4]
# [5]
# [6]]
- 如果兩個(gè)數(shù)組的維度長(zhǎng)度相同,或者其中一個(gè)數(shù)組在某個(gè)維度上的長(zhǎng)度為1,那么這兩個(gè)數(shù)組在該維度上是兼容的。
a. 二維數(shù)組中,第一維度:行數(shù);第二維度:列數(shù);
# 創(chuàng)建示例數(shù)組
arr1 = np.array([1, 2, 3]) # 形狀為 (3,)
# [1 2 3]
arr2 = np.array([[4, 5, 6]]) # 形狀為 (1, 3)
# [[4 5 6]]
# 在維度長(zhǎng)度相同的情況下,數(shù)組在該維度上是兼容的
result = arr1 + arr2
print("運(yùn)算結(jié)果:")
print(result)
# [[5 7 9]]
- 如果兩個(gè)數(shù)組在所有維度上的長(zhǎng)度都不相等,且其中沒有一個(gè)數(shù)組的長(zhǎng)度為1,則無法進(jìn)行廣播,會(huì)引發(fā)錯(cuò)誤。
# 創(chuàng)建示例數(shù)組
arr1 = np.array([1, 2, 3]) # 形狀為 (3,)
# [1 2 3]
arr2 = np.array([4, 5, 6, 7]) # 形狀為 (4,)
# [4 5 6 7]
# 無法進(jìn)行廣播,會(huì)引發(fā)錯(cuò)誤
result = arr1 + arr2
# 運(yùn)行到此處時(shí)會(huì)拋出 ValueError: operands could not be broadcast together with shapes (3,) (4,) 錯(cuò)誤
廣播機(jī)制的應(yīng)用場(chǎng)景包括:
- 對(duì)不同形狀的數(shù)組進(jìn)行元素級(jí)別的運(yùn)算,如加法、乘法等。
# 廣播示例1: 不同形狀的數(shù)組相加
arr1 = np.array([1, 2, 3]) # 形狀 (3, ) 維度 1
arr2 = np.array([[4, 5, 6], [7, 8, 9]]) # 形狀 (2, 3) 維度 2
result2 = arr1 + arr2
# 為了使它們的維度數(shù)相同,arr1會(huì)在其形狀中添加一個(gè)長(zhǎng)度為1的維度,變?yōu)?(1, 3)
# [[1, 2, 3]]
print("不同形狀的數(shù)組相加結(jié)果:")
print(result2)
# [[ 5 7 9]
# [ 8 10 12]]
- 在數(shù)組與標(biāo)量之間進(jìn)行運(yùn)算,將標(biāo)量廣播到數(shù)組的每個(gè)元素。
# 廣播示例2: 數(shù)組與標(biāo)量的運(yùn)算
scalar = 10
arr1 = np.array([1, 2, 3])
result1 = arr1 + scalar
print("數(shù)組與標(biāo)量的運(yùn)算結(jié)果:")
print(result1)
# [11 12 13]
- 在數(shù)組與更高維度的數(shù)組之間進(jìn)行運(yùn)算,使其形狀兼容。
數(shù)學(xué)函數(shù)及線性代數(shù)操作
NumPy提供了廣泛的數(shù)學(xué)函數(shù)和線性代數(shù)操作,可以對(duì)數(shù)組進(jìn)行各種數(shù)學(xué)運(yùn)算和矩陣操作。以下是一些常用的數(shù)學(xué)函數(shù)和線性代數(shù)操作示例:
-
np.sin(arr):計(jì)算數(shù)組中每個(gè)元素的正弦值。
# 使用數(shù)學(xué)函數(shù)
sin_result = np.sin(arr1)
print("正弦值:", sin_result)
-
np.cos(arr):計(jì)算數(shù)組中每個(gè)元素的余弦值。 -
np.exp(arr):計(jì)算數(shù)組中每個(gè)元素的指數(shù)值。 -
np.log(arr):計(jì)算數(shù)組中每個(gè)元素的自然對(duì)數(shù)。 -
np.dot(arr1, arr2):計(jì)算兩個(gè)數(shù)組的點(diǎn)積。
# 進(jìn)行矩陣乘法
matrix1 = np.array([[1, 2], [3, 4]])
# [[1 2]
# [3 4]]
matrix2 = np.array([[5, 6], [7, 8]])
# [[5 6]
# [7 8]]
dot_result = np.dot(matrix1, matrix2)
print("矩陣乘法結(jié)果:")
print(dot_result)
# [[19 22]
# [43 50]]
-
np.transpose(arr):計(jì)算數(shù)組的轉(zhuǎn)置。
matrix1 = np.array([[1, 2], [3, 4]])
# [[1 2]
# [3 4]]
# 計(jì)算數(shù)組的轉(zhuǎn)置
transpose_result = np.transpose(matrix1)
print("數(shù)組轉(zhuǎn)置結(jié)果:")
print(transpose_result)
# [[1 3]
# [2 4]]
-
np.linalg.inv(arr):計(jì)算數(shù)組的逆矩陣。
matrix1 = np.array([[1, 2], [3, 4]])
# [[1 2]
# [3 4]]
# 計(jì)算數(shù)組的逆矩陣
inv_result = np.linalg.inv(matrix1)
print("逆矩陣結(jié)果:")
print(inv_result)
# [[-2. 1. ]
# [ 1.5 -0.5]]
5. 數(shù)組的讀寫存儲(chǔ)
NumPy提供了方便的函數(shù)來讀寫和存儲(chǔ)數(shù)組數(shù)據(jù)。在本節(jié)中,學(xué)習(xí)如何使用NumPy讀取和寫入數(shù)組數(shù)據(jù)。
讀寫數(shù)組
寫入數(shù)組數(shù)據(jù)
使用NumPy的np.save()函數(shù)。該函數(shù)將數(shù)組數(shù)據(jù)保存到二進(jìn)制文件中,以便以后讀取使用。
# 創(chuàng)建一個(gè)數(shù)組
arr = np.array([1, 2, 3, 4, 5])
# 寫入數(shù)組數(shù)據(jù)
np.save('data.npy', arr)
讀取數(shù)組數(shù)據(jù)
使用NumPy的np.load()函數(shù)。該函數(shù)從存儲(chǔ)的二進(jìn)制文件中加載數(shù)組,并返回一個(gè)包含數(shù)組數(shù)據(jù)的NumPy數(shù)組對(duì)象。
# 讀取數(shù)組數(shù)據(jù)
arr = np.load('data.npy')
# 打印數(shù)組
print(arr)
存儲(chǔ)與加載數(shù)組
除了讀寫數(shù)組數(shù)據(jù),NumPy還提供了更靈活的函數(shù)來存儲(chǔ)和加載數(shù)組數(shù)據(jù),如np.savez()和np.load()。
使用np.savez()函數(shù)可以將多個(gè)數(shù)組保存到一個(gè)壓縮文件.npz中。
# 創(chuàng)建兩個(gè)數(shù)組
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 存儲(chǔ)多個(gè)數(shù)組數(shù)據(jù)
np.savez('data.npz', array1=arr1, array2=arr2)
使用np.load()函數(shù)加載.npz文件時(shí),它會(huì)返回一個(gè)類似于字典的對(duì)象,其中包含了被保存的數(shù)組數(shù)據(jù)。
# 加載多個(gè)數(shù)組數(shù)據(jù)
data = np.load('data.npz')
# 訪問數(shù)組數(shù)據(jù)
arr1 = data['array1']
arr2 = data['array2']
# 打印數(shù)組
print(arr1)
print(arr2)
6. 數(shù)組的統(tǒng)計(jì)計(jì)算
在NumPy中,我們可以對(duì)數(shù)組進(jìn)行各種統(tǒng)計(jì)計(jì)算。這些計(jì)算可以幫助我們了解數(shù)組中的數(shù)據(jù)分布、趨勢(shì)和相關(guān)性等信息。
基本統(tǒng)計(jì)計(jì)算
平均值(mean):計(jì)算數(shù)組的平均值。
標(biāo)準(zhǔn)差(std):計(jì)算數(shù)組的標(biāo)準(zhǔn)差,衡量數(shù)據(jù)的離散程度。
方差(var):計(jì)算數(shù)組的方差,衡量數(shù)據(jù)的離散程度。
最小值(min):找到數(shù)組中的最小值。
最大值(max):找到數(shù)組中的最大值。
總和(sum):計(jì)算數(shù)組中所有元素的總和。
最小值索引(argmin):找到數(shù)組中最小值的索引。
最大值索引(argmax):找到數(shù)組中最大值的索引。
高級(jí)統(tǒng)計(jì)計(jì)算
百分位數(shù)(percentiles):計(jì)算數(shù)組中給定百分比的元素值。
arr = np.array([1, 2, 3, 4, 5])
# 計(jì)算50%的百分位數(shù)【計(jì)算50%的百分位數(shù)就是返回?cái)?shù)組中的中位數(shù)】
percentile_value = np.percentile(arr, 50)
print(percentile_value)
# 3.0
# 找到一個(gè)值,使得10%的元素小于或等于這個(gè)值
percentile_value = np.percentile(arr, 10)
print(percentile_value)
# 1.4
中位數(shù)(median):計(jì)算數(shù)組的中位數(shù)。
arr = np.array([1, 2, 3, 4, 5])
median_value = np.median(arr)
print(median_value)
# 3.0
相關(guān)系數(shù)(corrcoef):計(jì)算數(shù)組的相關(guān)系數(shù)。
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([5, 4, 3, 2, 1])
corrcoef_value = np.corrcoef(arr1, arr2)
print(corrcoef_value)
# [[ 1. -1.]
# [-1. 1.]]
協(xié)方差(cov):計(jì)算數(shù)組的協(xié)方差矩陣。
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([5, 4, 3, 2, 1])
cov_matrix = np.cov(arr1, arr2)
print(cov_matrix)
# [[ 2.5 -2.5]
# [-2.5 2.5]]
直方圖(histogram):計(jì)算數(shù)組的直方圖。
直方圖是一種用于可視化數(shù)據(jù)分布的圖形表示方法。
它將數(shù)據(jù)劃分為一系列稱為“箱子”(或“柱”)的區(qū)間,并計(jì)算落入每個(gè)區(qū)間的數(shù)據(jù)點(diǎn)數(shù)量。
直方圖可以幫助我們了解數(shù)據(jù)的分布情況、數(shù)據(jù)的集中程度和數(shù)據(jù)的離散程度。
-
hist是一個(gè)包含每個(gè)區(qū)間內(nèi)數(shù)據(jù)點(diǎn)數(shù)量的數(shù)組 -
bins是一個(gè)包含劃分的區(qū)間邊界值的數(shù)組
arr = np.array([1, 2, 3, 4, 5])
hist, bins = np.histogram(arr)
print(hist)
print(bins)
# [1 0 1 0 0 1 0 1 0 1]
# [1. 1.4 1.8 2.2 2.6 3. 3.4 3.8 4.2 4.6 5. ]
差分(diff):計(jì)算數(shù)組的差分值。
差分操作將計(jì)算相鄰元素之間的差值
arr = np.array([1, 2, 3, 4, 5])
diff_arr = np.diff(arr)
print(diff_arr)
# [1 1 1 1]
梯度(gradient):計(jì)算數(shù)組的梯度。
數(shù)組的梯度是指數(shù)組中相鄰元素之間的變化率或斜率。
對(duì)于一維數(shù)組,梯度表示每個(gè)元素的變化幅度;
對(duì)于多維數(shù)組,梯度表示在每個(gè)維度上的變化幅度。
arr = np.array([1, 2, 3, 4, 5])
gradient_arr = np.gradient(arr)
print(gradient_arr)
# [1. 1. 1. 1. 1.]
7. 數(shù)組的復(fù)制和視圖
在 NumPy 中,對(duì)數(shù)組進(jìn)行復(fù)制和視圖操作是常見的操作之一。理解復(fù)制和視圖的概念及其區(qū)別對(duì)于正確處理數(shù)組非常重要。本教程將介紹深度復(fù)制、淺復(fù)制和視圖的概念以及它們之間的區(qū)別。
深度復(fù)制
深度復(fù)制是指創(chuàng)建一個(gè)完全獨(dú)立于原始數(shù)組的新數(shù)組,即在內(nèi)存中生成一個(gè)完全相同的副本。對(duì)復(fù)制后的數(shù)組進(jìn)行修改不會(huì)影響原始數(shù)組。
使用 copy() 方法可以進(jìn)行深度復(fù)制。
arr = np.array([1, 2, 3, 4, 5])
arr_copy = arr.copy()
# 修改復(fù)制后的數(shù)組,不會(huì)影響原始數(shù)組
arr_copy[0] = 10
print("原始數(shù)組:", arr)
print("深度復(fù)制后的數(shù)組:", arr_copy)
# 原始數(shù)組: [1 2 3 4 5]
# 深度復(fù)制后的數(shù)組: [10 2 3 4 5]
淺復(fù)制
淺復(fù)制是指創(chuàng)建一個(gè)新的數(shù)組對(duì)象,但該對(duì)象與原始數(shù)組共享相同的數(shù)據(jù)內(nèi)容。這意味著對(duì)淺復(fù)制后的數(shù)組進(jìn)行修改會(huì)影響原始數(shù)組。
使用切片操作或 view()方法可以進(jìn)行淺復(fù)制。
arr = np.array([1, 2, 3, 4, 5])
arr_shallow_copy = arr[:]
# 修改淺復(fù)制后的數(shù)組,會(huì)影響原始數(shù)組
arr_shallow_copy[0] = 10
print("原始數(shù)組:", arr)
print("淺復(fù)制后的數(shù)組:", arr_shallow_copy)
# 原始數(shù)組: [10 2 3 4 5]
# 淺復(fù)制后的數(shù)組: [10 2 3 4 5]
視圖
視圖是指創(chuàng)建一個(gè)新的數(shù)組對(duì)象,與原始數(shù)組共享相同的數(shù)據(jù)內(nèi)容,但具有不同的維度大小或形狀。對(duì)視圖進(jìn)行修改會(huì)影響原始數(shù)組,反之亦然。
使用view()方法可以創(chuàng)建視圖。
arr = np.array([1, 2, 3, 4, 5])
arr_view = arr.view()
# 修改視圖的形狀和大小
arr_view.shape = (5, 1)
arr_view[1] = 10
print("原始數(shù)組:", arr)
print("視圖數(shù)組:", arr_view)
# 原始數(shù)組: [ 1 10 3 4 5]
# 視圖數(shù)組: [[ 1]
# [10]
# [ 3]
# [ 4]
# [ 5]]