深入學(xué)習(xí)NumPy:掌握數(shù)組操作與應(yīng)用的終極指南

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)整:

  1. 如果兩個(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]]
  1. 如果兩個(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]]
  1. 如果兩個(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]]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容