?一、?Numpy庫簡介
1.1、概念
????????NumPy(Numerical Python)是一個開源的Python科學計算庫,旨在為Python提供 高性能的多維數組對象和一系列工具。NumPy數組是Python數據分析的基礎,許多 其他的數據處理庫(如Pandas、SciPy)都依賴于NumPy。
NumPy的一些主要特點:
1. 高性能:NumPy底層主要采用C語言編寫,相比于python來說運算速度快,性能 優越,并且保留了python的易用性。
2. 多維數組:NumPy提供了強大的n維數組對象ndarray,可進行高效的數據處 理,這是Numpy進行數據處理的核心對象。
3. 豐富的函數:NumPy內置了大量數學、統計和線性代數函數,方便進行數據計 算,除此之外還具有廣播功能,可以允許不同形狀的數組進行算術運算。
4. 廣泛的接口:NumPy與許多其他科學計算庫(如Matplotlib、SciPy)兼容,可 輕松實現數據交換和集成,此外,在人工智能領域中也可以很方便的和神經網絡 中使用的張量進行結構轉換。
1.2、安裝?
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/?
二、Numpy-array與list的區別?
????????Python中的list雖然可以靈活的處理多個元素,但它的效率很低,一般情況下 的科學運算的數據量是非常龐大的,所以list的效率低會導致整個科學運算的過程變 得非常慢。與之相比,Ndarray數組具有以下特點:
1. Ndarray數組所有元素的數據類型相同、數據地址連續,批量操作數組元素時速 度更快,而list中元素的數據類型可能不同,需要通過尋址的方式找到下一個元 素。
2. Ndarray數組支持廣播機制,矩陣運算時不需要寫for循環。
3. 底層主要使用C語言實現,運行速度遠高于Python代碼。
三、數組的創建
3.1、array創建數組
?創建一個數組,可以轉換任何形式的序列(如列表或元組)為NumPy數組。
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
名稱 | 描述 |
---|---|
object | 數組或嵌套的數列 |
dtype | 數組元素的數據類型,可選 |
copy | 對象是否需要復制,可選 |
order | 創建數組的樣式,C為行方向,F為列方向,A為任意方向(默認) |
subok | 默認返回一個與基類類型一致的數組 |
ndmin | 指定生成數組的最小維度 |
import numpy as nparr1=np.array([1,2,3,4,5,6]
)
arr2=np.array([[1,2,3],[4,5,6],[7,8,9]]
)print(arr1)
print(arr2)'''
[1 2 3 4 5 6]
[[1 2 3][4 5 6][7 8 9]]
'''
3.2、arange創建數組
創建一個均勻間隔的數值數組,類似于Python的內置?range
?函數。
numpy.arange([start,] stop[, step,], dtype=None)
參數 | 描述 |
---|---|
start | 起始值,默認為0 |
stop | 終止值(不包含) |
step | 步長,默認為1 |
dtype | 返回ndarray的數據類型,如果沒有提供,則會使用輸入數據的類型。 |
import numpy as nparr1=np.arange(1,10,1)print(arr1)'''
[1 2 3 4 5 6 7 8 9]
'''
3.3、zeros函數
創建一個指定形狀的數組,所有元素初始化為0。
numpy.zeros(shape, dtype=float, order='C')
參數 | 描述 |
---|---|
shape | 一個整數或整數元組,用于指定輸出數組的形狀 |
dtype | 可選參數,指定數組元素的數據類型。默認為 float |
order | 可選參數,指定數組數據在內存中的存儲順序。‘C’ 表示按行(C語言風 格),‘F’ 表示按列(Fortran風格) |
import numpy as nparr1=np.zeros(10)print(arr1)'''
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
'''
import numpy as nparr2=np.zeros((3,3))print(arr2)'''
[[0. 0. 0.][0. 0. 0.][0. 0. 0.]]
'''
3.4、ones函數
創建一個指定形狀的數組,所有元素初始化為1。
numpy.ones(shape, dtype=float, order='C')
參數 | 描述 |
---|---|
shape | 一個整數或整數元組,用于指定輸出數組的形狀 |
dtype | 可選參數,指定數組元素的數據類型。默認為 float |
order | 可選參數,指定數組數據在內存中的存儲順序。‘C’ 表示按行(C語言風 格),‘F’ 表示按列(Fortran風格) |
import numpy as nparr1=np.ones(10)
arr2=np.ones((3,3))print(f'arr1==={arr1}')
print()
print(f'arr2==={arr2}')'''
arr1===[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]arr2===[[1. 1. 1.][1. 1. 1.][1. 1. 1.]]
'''
3.5、empty函數
創建一個指定形狀的數組,未初始化,元素值可能是隨機的。
numpy.empty(shape, dtype=float, order='C')
參數 | 描述 |
---|---|
shape | 一個整數或整數元組,用于指定輸出數組的形狀 |
dtype | 可選參數,指定數組元素的數據類型。默認為 float |
order | 可選參數,指定數組數據在內存中的存儲順序。‘C’ 表示按行(C語言風 格),‘F’ 表示按列(Fortran風格) |
import numpy as nparr1=np.empty(10)
arr2=np.empty((3,3))print(f'arr1==={arr1}')
print()
print(f'arr2==={arr2}')'''
arr1===[2.09197419e-076 1.87725413e-009 1.41866238e+161 3.56792062e-0575.42801934e-096 5.98147383e-154 3.98454986e+252 5.12981117e-1151.02245668e-259 2.25563609e-153]arr2===[[0.0000000e+000 0.0000000e+000 0.0000000e+000][0.0000000e+000 0.0000000e+000 3.1224949e-321][0.0000000e+000 0.0000000e+000 3.2845213e-287]]
'''
3.6、full函數
創建一個指定形狀的數組,所有元素初始化為用戶定義的值。
numpy.full(shape, fill_value, dtype=None, order='C')
參數 | 描述 |
---|---|
shape | 一個整數或整數元組,用于指定輸出數組的形狀 |
fill_value | 用于填充數組的值 |
dtype | 可選,指定數組元素的數據類型。如果未指定,則從 fill_value 推 斷。 |
order | 可選,指定數組數據在內存中的存儲順序。‘C’ 表示按行優先順序;‘F’ 表 示按列優先順序。 |
import numpy as nparr1=np.full(10,10)
arr2=np.full((3,3),3)print(f'arr1==={arr1}')
print()
print(f'arr2==={arr2}')'''
arr1===[10 10 10 10 10 10 10 10 10 10]arr2===[[3 3 3][3 3 3][3 3 3]]
'''
3.7、eye函數
創建一個單位矩陣(對角線為1,其余為0)。
eye(N, M=None, k=0, dtype=<class 'float'>, order='C')
參數 | 描述 |
---|---|
N | 矩陣的行數。如果只指定 N,則返回一個 N×N 的單位矩陣 |
M | 矩陣的列數。如果指定,返回一個形狀為 (N, M) 的矩陣 |
k | 對角線的偏移量。k 為 0 時返回主對角線的單位矩陣;k > 0 時返回主對角線上方的對角線;k < 0 時返回主對角線下方的對角線 |
dtype | 可選,指定數組元素的數據類型。如果未指定,則從 fill_value 推 斷。 |
order | 可選,指定數組數據在內存中的存儲順序。‘C’ 表示按行優先順序;‘F’ 表 示按列優先順序。 |
import numpy as nparr1=np.eye(10)
arr2=np.eye(3,3)print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.][0. 1. 0. 0. 0. 0. 0. 0. 0. 0.][0. 0. 1. 0. 0. 0. 0. 0. 0. 0.][0. 0. 0. 1. 0. 0. 0. 0. 0. 0.][0. 0. 0. 0. 1. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 1. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0. 1. 0. 0. 0.][0. 0. 0. 0. 0. 0. 0. 1. 0. 0.][0. 0. 0. 0. 0. 0. 0. 0. 1. 0.][0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]arr2===
[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]
'''
3.8、linspace函數
創建一個均勻分布的數組,包含指定數量的值。
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
參數 | 描述 |
---|---|
start | 序列的起始值 |
stop | 序列的終止值,如果endpoint為true,該值包含于數列中 |
num | 要生成的等步長的樣本數量,默認為50 |
endpoint | 該值為 ture 時,數列中中包含stop值,反之不包含,默認是True。 |
retstep | 如果為 True 時,生成的數組中會顯示間距,反之不顯示。 |
dtype | ndarray 的數據類型 |
import numpy as nparr1=np.linspace(10,100,20)
arr2=np.linspace(3,3)print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[ 10. 14.73684211 19.47368421 24.21052632 28.9473684233.68421053 38.42105263 43.15789474 47.89473684 52.6315789557.36842105 62.10526316 66.84210526 71.57894737 76.3157894781.05263158 85.78947368 90.52631579 95.26315789 100. ]arr2===
[3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3.3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3.3. 3.]
'''
3.9、logspace函數
創建一個對數均勻分布的數組,指定范圍的對數數值。
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
參數 | 描述 |
---|---|
start | 序列的起始值為:base ** start |
stop | 序列的終止值為:base ** stop。如果endpoint為true,該值包含于數列中 |
num | 要生成的等步長的樣本數量,默認為50 |
endpoint | 該值為 ture 時,數列中中包含stop值,反之不包含,默認是True。 |
base | 對數 log 的底數。 |
dtype | ndarray 的數據類型 |
import numpy as nparr1=np.logspace(10,100,10)
arr2=np.logspace(3,3)print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[1.e+010 1.e+020 1.e+030 1.e+040 1.e+050 1.e+060 1.e+070 1.e+080 1.e+0901.e+100]arr2===
[1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000.1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000.1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000.1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000.1000. 1000.]
'''
四、隨機數組的創建
函數 | 說明 |
---|---|
seed | 確定隨機生成器種子 |
rand | 產生均勻分布的樣本值 |
random(size=None) | 該方法返回[0.0, 1.0)范圍的隨機數。 |
randn(d0,d1,…,dn) | randn函數返回一個或一組樣本,具有標準正態分布(期望為0,方差為1)。dn表格每個維度,返回值為指定維度的array |
normal | 用于從具有指定平均值(mean)和標準差(standard deviation)的正態分 布(也稱為高斯分布)中抽取樣本。 |
randint | 該方法有三個參數low、high、size三個參數。默認high是None,如果只有low,那范圍就是[0,low)。如果有high,范圍就是[low,high)。 |
uniform | 該函數用于從均勻分布中抽取一個浮點數 |
shuffle | 對一個序列就地隨機排列 |
4.1、seed函數
????????隨機數種子(random seed)是一個用于初始化隨機數生成器(random number generator, RNG)的值。在計算機科學中,大多數的隨機數生成器實際上是偽隨機 數生成器(pseudo-random number generators, PRNGs),它們通過一個算法來 生成一系列看似隨機的數字。偽隨機數生成器的特點是可以重現生成的隨機數序列, 這是通過設置相同的隨機數種子來實現的。
設置隨機數種子,種子值可以是任何整數,通常是正整數。
特點:
????????1. 可重現性:通過設置相同的隨機數種子,每次程序運行時生成的隨機數序列都是 相同的。這對于調試程序、進行科學計算或模擬時保持實驗結果的一致性非常有 用。
????????2. 算法確定性:偽隨機數生成器是確定性的,這意味著給定的種子會總是產生相同 的隨機數序列,這與真正的隨機數生成器不同,后者總會生成不同的隨機數。
????????3. 種子來源:隨機數種子的值可以是任意的。在許多編程環境中,如果不顯式設置 種子,通常會使用當前時間作為種子,這樣每次程序運行時都會產生不同的隨機 數序列。
????????4. 跨平臺差異:不同的操作系統或硬件平臺可能會產生不同的隨機數序列,即使種 子相同。這是因為不同的平臺可能有不同的PRNG算法。
import numpy as np
np.random.seed(42)
4.2、rand函數
生成均勻分布的隨機數(0到1之間),可以指定形狀。
numpy.random.rand(d0, d1, ..., dn)
函數 | 說明 |
---|---|
d0, d1, ..., dn | 這些參數定義了輸出數組的形狀。它們是整數,指定了每個 維度的大小。例如,d0 是第一個維度的大小,d1 是第二個維度的大小,依此類 推。 |
import numpy as nparr1=np.random.rand(10)print(f'arr1===\n{arr1}')'''
arr1===
[0.92463939 0.94486905 0.74476479 0.25784553 0.85425486 0.571607250.95990865 0.36395052 0.41709035 0.82599918]
'''
4.3、random函數
與?rand
?類似,但提供更靈活的隨機數生成。
numpy.random.random(size=None)
函數 | 說明 |
---|---|
size | 這是一個可選參數,用于指定輸出數組的形狀。它可以是一個整數,也 可以是一個元組。如果 size 是一個整數,則返回一個一維數組;如果 一個元組,則返回一個多維數組,其形狀與元組指定的一致 |
import numpy as nparr1=np.random.random(10)arr2=np.random.random((3,3))print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[0.62721499 0.21350623 0.83140219 0.41729457 0.70818569 0.550753530.57016909 0.42416555 0.11372102 0.7405065 ]arr2===
[[0.96151613 0.96612422 0.49951694][0.9377553 0.61001206 0.88551393][0.22225505 0.51794861 0.36731721]]
'''
4.4、randn函數
生成標準正態分布(均值為0,標準差為1)的隨機數。
numpy.random.randn(d0, d1, ..., dn)
函數 | 說明 |
---|---|
d0, d1, ..., dn | 這些參數指定了輸出數組的維度。如果你只提供一個數字, 它將返回一個一維數組;如果你提供多個數字,它將返回一個多維數組,其中每 個維度的大小由對應的參數指定 |
import numpy as nparr1=np.random.randn(10)arr2=np.random.randn(3,4)print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[-0.49202485 -0.26029324 0.46349285 -1.4871595 -1.15332575 0.48229266-1.04077328 0.52712378 -0.40422044 1.82175024]arr2===
[[ 0.0348239 0.96843211 0.41392382 0.51399037][ 1.13157601 -1.35735621 -2.2765836 -0.52266114][-0.8062335 -0.55222009 -1.00520723 -1.84433436]]
'''
4.5、normal函數
生成給定均值和標準差的正態分布隨機數。
numpy.random.normal(loc=0.0, scale=1.0, size=None)
函數 | 說明 |
---|---|
loc | 正態分布的均值,對應于分布的中心位置,默認值為 0.0 |
scale | 正態分布的標準差,對應于分布的寬度,默認值為 1.0 |
size | 輸出數組的形狀。如果是一個整數,返回一維數組。如果是一個元組,返回多維數組。默認為None返回一個隨機數 |
import numpy as nparr1=np.random.normal(size=10)arr2=np.random.normal(size=(3,4))print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[-0.23383662 0.97632058 0.48245764 -1.71405263 0.0625902 2.32371938-1.16770879 0.20876465 -2.16149186 -0.05048533]arr2===
[[-0.68925419 -2.12716386 -1.06562238 1.11568077][ 0.02078178 -0.31270599 -1.90545882 -0.850884 ][ 0.66213069 2.28670915 -0.88748761 0.13641803]]
'''
4.6、randint函數
生成指定范圍內的隨機整數。
numpy.random.randint(low, high=None, size=None, dtype=int)
函數 | 說明 |
---|---|
low | 生成隨機數的起始點(包含)。如果只提供了low參數而沒有提供high參數,那么隨機整數的范圍將是從 0 到low (不包含 low本身) |
high | 生成隨機數的結束點(不包含) |
size | 定義輸出數組形狀的整數或元組。例如,size(m,n)將生成 一個 m 行 n 列的數組 |
dtype | 指定返回數組的數據類型,默認為int |
import numpy as nparr1=np.random.randint(0,10,size=10)arr2=np.random.randint(0,10,size=(3,4))print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[3 1 3 7 2 7 0 5 4 8]arr2===
[[4 7 9 6][3 8 2 0][2 0 4 5]]'''
4.7、uniform函數
生成指定范圍內的均勻分布隨機數。
numpy.random.uniform(low=0.0, high=1.0, size=None)
函數 | 說明 |
---|---|
low | 浮點數或類似浮點數的數組,表示樣本抽取區間的下限,默認值為 0 |
high | 浮點數或類似浮點數的數組,表示樣本抽取區間的上限,默認值為 1 |
size | 整數或元組,可選參數,表示輸出的形狀。如果未提供,則返回單個浮 點數。如果提供了一個整數,則返回一個一維數組;如果提供了一個元組,則返 回一個多維數組 |
import numpy as nparr1=np.random.uniform(0,10,size=5)arr2=np.random.uniform(0,10,size=(3,4))print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[7.96891358 0.19647614 5.42047937 1.49001317 9.04060667]arr2===
[[3.44988119 0.82911361 7.53272753 2.65165757][6.13385131 2.30715477 0.73983801 7.05093042][5.82714561 2.25635848 3.37875838 8.62424195]]
'''
4.8、shuffle函數
對數組進行隨機重排,原地改變數組順序。
numpy.random.shuffle(x)
函數 | 說明 |
---|---|
x | 要打亂的數組 |
import numpy as nparr1=np.array([[1,2,3],[4,5,6],[7,8,9]
])
print('改變之前')
print(f'arr1===\n{arr1}')np.random.shuffle(arr1)print('改變之后')
print(f'arr1===\n{arr1}')'''
arr1===
改變之前
arr1===
[[1 2 3][4 5 6][7 8 9]]
改變之后
arr1===
[[1 2 3][7 8 9][4 5 6]]'''