NumPy 使用教學
NumPy 是 Python 中用于科學計算的基礎庫,它提供了高性能的多維數組對象以及用于處理這些數組的工具。下面將結合多個代碼文件,詳細介紹 NumPy 的各種用法。
1. 創建數組
1.1 從列表創建數組
import numpy as np# 一維數組
list1 = [1,2,3,4,5]
print(list1)
v = np.array(list1)
print(v)# 二維數組[多個一維數組構成]
m = np.array([list1,list1,list1])
print(m)# 三維數組[多個二維數組構成]
z = np.array([[list1,list1,list1],[list1,list1,list1],[list1,list1,list1]])
print(z)z = np.array([m,m,m])
print(z)# 更高維的
y = np.array([z,z,z])
print(y)
運行結果:首先打印出原始列表?list1
,然后依次打印出一維數組?v
、二維數組?m
、三維數組?z
?和更高維數組?y
。
函數解析:np.array()
?函數用于將 Python 列表轉換為 NumPy 數組。可以傳入一維、二維或更高維的列表來創建相應維度的數組。
1.2 創建特殊的數組
import numpy as np# 創建全為 0 的數組
a = np.zeros(5)
b = np.zeros((2,2))
c = np.zeros((3,2,2))
print(a, '\n', b, '\n', c)# 創建全為 1 的數組
d = np.ones(5)
e = np.ones((2,2))
f = np.ones((2,2,2))# 創建全為 2 的數組……矩陣中全部填充指定的數據
g = np.full((2,2,2),5)
print(g)# 小補充: 5 行×7 列的類單位矩陣(對角矩陣)
h = np.eye(5,7)
print(h)
運行結果:打印出全 0 數組?a
、b
、c
,全 1 數組?d
、e
、f
,全 5 數組?g
?以及 5 行 7 列的類單位矩陣?h
。
函數解析:
np.zeros()
:創建指定形狀的全 0 數組。np.ones()
:創建指定形狀的全 1 數組。np.full()
:創建指定形狀并填充指定值的數組。np.eye()
:創建指定行數和列數的類單位矩陣(對角矩陣)。
2. 數組的基本屬性
import numpy as np
list1 = [1,2,3,4,5]
m = np.array([list1,list1,list1])
a = m.shape
b = m.ndim
c = m.size
d = m.dtype
print("二維數組")
print(type(m))
print(a)
print(b)
print(c)
print(d)
# 三維數組
print("三維數組")
z = np.array([m,m,m])
print(z.shape)
print(z.ndim)
print(z.size)
print(type(z))
print(z.dtype)
運行結果:先打印二維數組?m
?的類型、形狀、維度、元素個數和元素類型,再打印三維數組?z
?的相關信息。
函數解析:
shape
:返回數組的形狀,用元組表示。ndim
:返回數組的維度。size
:返回數組中元素的個數。dtype
:返回數組中元素的類型。
3. 數組的升維與降維
3.1 數組的升維
import numpy as nplist1 = [1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8]
v = np.array(list1)
print(v)# 一維變二維[-1 表示自己計算]【返回一個改變后的矩陣】
r1 = v.reshape(4,4)
print(r1)
r1 = v.reshape(-1,4)
print(r1)
print(r1.ndim)# 一維變三維
r2 = v.reshape(1,-1,2)
print(r2)# 二維變三維
r3 = r1.reshape(2,2,4)
print("###")
print(r3)
print("###")# resize()【不返回計算結果】【直接修改原始數組】
v.resize(4,4)
print(v)
運行結果:先打印一維數組?v
,然后依次打印升維后的二維數組?r1
、三維數組?r2
、r3
,最后打印使用?resize()
?修改后的數組?v
。
函數解析:
reshape()
:返回一個具有新形狀的數組,原數組不變。-1
?作為占位符,讓 NumPy 自動計算該維度的大小。resize()
:直接修改原數組的形狀。
3.2 數組的降維
import numpy as nplist1 = [1,2,3,4,5,6,7,8]
print(list1)
v = np.array(list1)
print(v)
v = v.reshape(2,2,2)
print(v)
print(v.ndim)# 將三維降到二維
r1 = v.reshape(1,8)
print(r1)# 將高維數據轉化為一維 ravel()
r2 = v.ravel()
print(r2)# flatten()
r3 = v.flatten()
print(r3)# flatten 方法返回的是原數組的副本,這意味著對返回的一維數組所做的任何修改都不會影響原始的多維數組。
# ravel 方法(如果可能)返回的是原始數組的視圖,因此對返回的一維數組所做的修改可能會影響原始的多維數組。這是因為 ravel 改變了數組
v = np.array(list1)
print(v)# 小補充 shape 也可以實現降維
v.shape = (2,4)
print(v)
運行結果:先打印原始列表?list1
?和一維數組?v
,然后將?v
?變為三維數組并打印,接著依次打印降維后的二維數組?r1
、一維數組?r2
、r3
,最后打印使用?shape
?屬性修改后的數組?v
。
函數解析:
reshape()
:用于將數組轉換為指定形狀,可實現降維。ravel()
:返回一個一維數組,可能是原數組的視圖。flatten()
:返回一個一維數組,是原數組的副本。shape
?屬性:可直接修改數組的形狀。
4. 數組元素的選取與修改
4.1 一維數組元素的選取與修改
import numpy as nparray1 = np.arange(1,9,1)
print(array1)# 選取某個元素
a = array1[1]
# 選取某些元素
b = array1[[1,3,5]]
# 切片(左閉右開)
c = array1[0:6]
print(a, b, c)# 修改某個元素
print(array1)
array1[0] = 10
print(array1)# 批量修改某些元素
array1[[1,3,5]] = 20
print(array1)array1[0:6] = 100
print(array1)
運行結果:先打印一維數組?array1
,然后打印選取的單個元素?a
、多個元素?b
?和切片?c
,接著依次打印修改單個元素、多個元素和切片后的數組?array1
。
函數解析:
- 索引?
[]
:用于選取數組中的單個元素或多個元素。 - 切片?
[start:stop]
:用于選取數組中的一段元素,左閉右開區間。
4.2 二維數組元素的選取與修改
import numpy as nparray1 = np.arange(24).reshape(4,6)
print(array1)# 選取某個元素
a = array1[1,4]
# 選取某行元素
b = array1[3,:]
# 選取某些行
c = array1[0:2,:]
d = array1[[0,2],:]
# 選取某列
e = array1[:,3]
# 選取某些列
f = array1[:,0:3]
g = array1[:,[0,3]]
print(a)
print(b)
print(c)
print(d)
print(e)
print(f)
print(g)# 修改元素
# 修改某個元素
array1[1,4] = 100
print(array1)# 修改某行元素
array1[3,:] = 100
print(array1)
array1[[0,2],:] = 50
print(array1)
運行結果:先打印二維數組?array1
,然后依次打印選取的單個元素?a
、某行元素?b
、某些行?c
、d
、某列元素?e
、某些列?f
、g
,接著依次打印修改單個元素、某行元素和某些行元素后的數組?array1
。
函數解析:
- 二維索引?
[row, col]
:用于選取二維數組中的單個元素。 :
?用于表示選取整行或整列。- 可以使用切片或列表來選取多行或多列。
4.3 三維數組元素的選取與修改
import numpy as nparray1 = np.arange(48).reshape(2,4,6)
print(array1)# 選取某個元素
a = array1[1,0,0]
# 選取某行元素
b = array1[0,1,:]
# 選取某些行元素
c = array1[0,1:3,:]
d = array1[0,[1,3],:]
# 選取某列
e = array1[1,:,1]
# 選取某些列
f = array1[1,:,1:4]
g = array1[1,:,[1,4]]
print(a)
print(b)
print(c)
print(d)
print(e)
print(f)
print(g)
# 修改
array1[1,0,0] = 100
print(array1)# 選取第三個三維數組的 第二個二維數組的 第三行以及之后的所有行的 第二列到第三列
v = np.array([array1,array1,array1,array1])
h = v[2,1,2: ,1:3]
print(h)
運行結果:先打印三維數組?array1
,然后依次打印選取的單個元素?a
、某行元素?b
、某些行元素?c
、d
、某列元素?e
、某些列元素?f
、g
,接著打印修改單個元素后的數組?array1
,最后打印復雜選取的結果?h
。
函數解析:三維數組的選取和修改與二維數組類似,只是多了一個維度的索引。
5. 數組的組合與切割
5.1 數組的組合
import numpy as np# 生成基數組
array1 = np.arange(9).reshape(3,3)
array2 = 2*array1
print(array1)
print(array2)# 水平組合
a3 = np.hstack((array1,array2))
a4 = np.hstack((array2,array1))
a5 = np.hstack((array1,array2,array1))a6 = np.concatenate((array1,array2),axis=0)
# 連接#axis 表示連接的方向
# 垂直組合
a7 = np.vstack((array2,array1))a8 = np.concatenate((array1,array2),axis=0)
print(a3)
print(a4)
print(a5)
print(a6)
print(a7)
print(a8)
運行結果:先打印基數組?array1
?和?array2
,然后依次打印水平組合后的數組?a3
、a4
、a5
,垂直組合后的數組?a7
,以及使用?concatenate()
?連接后的數組?a6
、a8
。
函數解析:
np.hstack()
:水平組合數組。np.vstack()
:垂直組合數組。np.concatenate()
:可以指定?axis
?參數來決定按行(axis=0
)或按列(axis=1
)連接數組。
5.2 數組的切割
import numpy as np
array1 = np.arange(16).reshape(4,4)
print(array1)# 水平切割
a = np.hsplit(array1,2)
b = np.split(array1,2,axis=1)# 垂直切割
c = np.vsplit(array1,2)
d = np.split(array1,2,axis=0)# 強制切割
# 水平切割
e = np.array_split(array1,3,axis=1)# 垂直切割
f = np.array_split(array1,3,axis=0)print(a)
print(b)
print(c)
print(d)
print(e)
print(f)print("#####################################")
array1 = np.arange(25).reshape(5,5)
print(array1)g = np.array_split(array1,3,axis=1)
h = np.array_split(array1,3,axis=0)print(g)
print(h)
運行結果:先打印 4x4 的數組?array1
,然后依次打印水平切割、垂直切割和強制切割后的結果,接著打印 5x5 的數組?array1
?及其切割結果。
函數解析:
np.hsplit()
:水平切割數組。np.vsplit()
:垂直切割數組。np.split()
:可以指定?axis
?參數來決定按行(axis=0
)或按列(axis=1
)切割數組。np.array_split()
:可以進行非等分的切割。
6. 數組的算術運算與矩陣運算
6.1 數組的算術運算
import numpy as nparray1 = np.arange(1,5,1).reshape(2,2)
array2 = 2*array1
print(array1)
print(array2)# 數組的加法【對應位置的元素求和】
print(array1 + array2)# 數組的減法[對應位置元素相減]
print(array1 - array2)# 數組的乘法【對應位置相乘】
print(array1 * array2)# 數組的除法[對應位置相除]
print(array1 / array2)# 數組的取余(%)
print(array2 % array1)# 數組的取整
print(array2 // array1)
運行結果:先打印數組?array1
?和?array2
,然后依次打印它們的加法、減法、乘法、除法、取余和取整結果。
函數解析:NumPy 數組的算術運算都是對應元素之間的運算。
6.2 矩陣運算
import numpy as np# 生成兩個基數組
a = np.arange(4).reshape(2,2)
b = a.copy()
print(a)
print(b)
# 矩陣的運算
# 加減乘除(求逆)
# 加減 -> 對應元素加減# 矩陣的乘法【點乘】
# a * b
a1 = a.dot(b)
a2 = np.dot(a, b)
print(a1)
print(a2)# 矩陣求逆
"""
inv():
并不是所有的矩陣都有逆;
即使你沒有逆,給你一個逆【偽逆】
"""
a3 = np.linalg.inv(a)
print(a3)a4 = a.dot([[-1.5, 0.5],[ 1., 0. ]])
print(a4)
運行結果:先打印基數組?a
?和?b
,然后打印矩陣乘法結果?a1
、a2
,矩陣求逆結果?a3
,以及矩陣與另一個矩陣相乘的結果?a4
。
函數解析:
dot()
?或?np.dot()
:用于矩陣乘法。np.linalg.inv()
:用于求矩陣的逆。
7. NumPy 內的隨機模塊
7.1 生成隨機整數
import numpy as np
import matplotlib.pyplot as plt# 設置隨機種子,確保結果可復現
np.random.seed(1000)# 生成單個隨機整數(0 - 9 之間)
r1 = np.random.randint(0, 10)
print(f"生成的隨機整數是: {r1}")# 生成 100 個隨機整數并統計分布
a = [np.random.randint(0, 10) for i in range(100)]
print(a)# 繪制直方圖
plt.hist(a, color='r')
plt.show()
運行結果:打印生成的單個隨機整數?r1
?和 100 個隨機整數列表?a
,并顯示隨機整數分布的直方圖。
函數解析:
np.random.seed()
:設置隨機種子,確保每次運行代碼生成的隨機數相同。np.random.randint()
:生成指定范圍內的隨機整數。
7.2 生成隨機浮點數和特定分布的隨機數
import numpy as np# 設置隨機種子
np.random.seed(1000)# 生成 0 - 1 之間的隨機浮點數
random_float = np.random.rand()
print(f"生成的隨機浮點數是: {random_float}")"""
normal()->生成一些符合正態分布的數據
N~(日,1)
numpy.random.normal(loc=0.0,scale=1.0,size=None)
參數說明:
Loc:正態分布的均值(期望值),決定了分布的中心位置,默認值為 0.0
scale:正態分布的標準差,決定了分布的離散程度,默認值為 1.0
size:輸出數組的形狀,可以是整數(表示一維數組長度)或元組(表示多維數組形狀),默認值為 None(返回單個值)
"""
# 生成正態分布隨機數(均值 0,標準差 1)
normal_random = np.random.normal(loc=0, scale=1)
print(f"生成的正態分布隨機數是: {normal_random}")# 生成 5x5 的隨機整數數組(0 - 9 之間)
random_array = np.random.randint(0, 10, size=(5, 5))
print("生成的 5x5 隨機整數數組:")
print(random_array)# 生成指定形狀的均勻分布隨機數組
uniform_array = np.random.rand(3, 4)
print("\n生成的 3x4 均勻分布隨機數組:")
print(uniform_array)# 生成指定形狀的正態分布隨機數組
normal_array = np.random.normal(loc=5, scale=2, size=(2, 3))
print("\n生成的 2x3 正態分布隨機數組(均值 5,標準差 2):")
print(normal_array)
運行結果:依次打印生成的隨機浮點數、正態分布隨機數、5x5 隨機整數數組、3x4 均勻分布隨機數組和 2x3 正態分布隨機數組。
函數解析:
np.random.rand()
:生成 0 - 1 之間的隨機浮點數。np.random.normal()
:生成符合正態分布的隨機數。np.random.randint()
:可以指定?size
?參數生成多維隨機整數數組。
8. 數組的深拷貝與淺拷貝
import numpy as np
array1 = np.array([1,2,3])# 淺拷貝
array2 = array1
# 更改 array2 的元素的值
array2[0] = 100
print(array2)
print(array1)print("###################")# 深拷貝
array3 = array1.copy()
array3[0] = 10
print(array3)
print(array1)
運行結果:先打印淺拷貝后修改?array2
?元素值時?array2
?和?array1
?的值,再打印深拷貝后修改?array3
?元素值時?array3
?和?array1
?的值。
函數解析:
- 淺拷貝:
array2 = array1
?只是創建了一個指向同一數組的新引用,修改?array2
?會影響?array1
。 - 深拷貝:
array3 = array1.copy()
?創建了一個獨立的數組副本,修改?array3
?不會影響?array1
。
9. NumPy 內一些函數的使用
import numpy as nparray1 = np.random.normal(size = (3,3))
print(array1)# 一些函數
# 求方差
print(array1.var())# 求標準差
a = array1.std()# 求均值
b = array1.mean()# 求和
c = array1.sum()# 求中位數
d = np.median(array1)# 求和運算
# 對矩陣的行求和
e = array1.sum(axis=1)
# 對矩陣的列進行求和
f = array1.sum(axis=0)print(a)
print(b)
print(c)
print(d)
print(e)
print(f)
運行結果:先打印隨機生成的 3x3 數組?array1
,然后依次打印數組的方差、標準差、均值、總和、中位數,以及按行和按列求和的結果。
函數解析:
var()
:計算數組的方差。std()
:計算數組的標準差。mean()
:計算數組的均值。sum()
:計算數組的總和,可指定?axis
?參數按行或按列求和。np.median()
:計算數組的中位數。
10. 讀取和保存文件
# numpy.loadtxt(): 從文本文件中加載數據。這個函數假定文件中的每一行都有相同數量的值,
# 你可以使用 delimiter 參數指定分隔符,如逗號、制表符等。例如:
import numpy as npdata = np.loadtxt('a.txt', delimiter='\t')
print(data)# 將數組保存到 txt 文件中
import numpy as nparray = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
np.savetxt('b.txt', array)
運行結果:從?a.txt
?文件中讀取數據并打印,然后將一個 3x3 數組保存到?b.txt
?文件中。
函數解析:
np.loadtxt()
:從文本文件中加載數據,可指定分隔符。np.savetxt()
:將數組保存到文本文件中。