`NumPy`(Numerical Python)是一個`Python`庫,主要用於高效地處理多維數組和矩陣計算。它是科學計算領域中使用最廣泛的一個庫。 在`NumPy`中,**數組**是最核心的概念,用於存儲和操作數據。 `NumPy`數組是一種多維數組對象,可以存儲相同類型的元素,它支持高效的數 ...
NumPy
(Numerical Python)是一個Python
庫,主要用於高效地處理多維數組和矩陣計算。它是科學計算領域中使用最廣泛的一個庫。
在NumPy
中,數組是最核心的概念,用於存儲和操作數據。
NumPy
數組是一種多維數組對象,可以存儲相同類型的元素,它支持高效的數學運算和線性代數操作。
1. 數據類型
numpy
數組要求其中的元素必須是同一個類型的,雖然喪失了一些靈活性,卻帶來的性能的極大提升。
numpy
的數組中如果有字元串,那麼所有的值都變成字元型了。
再進行數學運算時會報錯,如下所示
import numpy as np
arr = np.array([1, "abc", 3.1])
arr + 1
#錯誤信息
UFuncTypeError: ufunc 'add' did not contain a loop with signature matching types ...
numpy
的標準數據類型主要是各類數值類型,畢竟這個庫主要就是用來做數值運算的。
numpy
支持如整數(int8、int16、int32、int64)、浮點數(float32、float64)、複數(complex64、complex128)等類型。
此外,numpy
還支持一些特殊類型,如布爾型(bool)、無類型(void)等。
具體請參考文檔:https://numpy.org/doc/stable/user/basics.types.html
選擇數據類型時,註意考慮數據類型的記憶體占用和計算效率,以選擇最優的數據類型。
2. 維,秩和軸
numpy
數組的維度,秩和軸這三個概念經常用到。
其中維度和軸是同樣的,維度是編程中常用說法,軸是線性代數中常用說法。
numpy
中維度或軸的信息通過shape
屬性獲取,比如:
import numpy as np
arr = np.array([[[1, 2, 3], [1, 2, 3]]])
arr.shape
#結果:
(1, 2, 3)
這個數組有3個維度(軸),但是每個維度(軸)方向的長度不一樣,分別是1,2,3
秩是指軸的個數,也就是維度的數量,比如上面的數組,秩就是3。
numpy
中秩的信息都過ndim
屬性來獲取,比如:
arr.ndim
#結果:
3
3. 創建方式
學習numpy
的數組,最重要的目的就是掌握如何運用numpy
的數組來進行數值計算。
學習numpy
數組的各類運算操作之前,掌握numpy
提供的各種數組創建方法必不可少。
numpy
提供了多種數組創建方式,每種方式都有其優點和意義。
根據實際需求選擇合適的創建方式可以方便地創建具有特定形狀和大小的數組,併為其分配記憶體空間,方便後續高效的學習各種數學運算和線性代數操作。
3.1. zeros
zeors
方法可以創建指定維度和類型的數組,數組的每個元素都是0。
一維,類型分別為int
和float
的數組。
import numpy as np
np.zeros(5, dtype=int)
#>>> array([0, 0, 0, 0, 0])
np.zeros(5, dtype=float)
#>>> array([0., 0., 0., 0., 0.])
不同維度的數組。
import numpy as np
np.zeros((3,3), dtype=float)
#>>>
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
np.zeros((2,4), dtype=float)
#>>>
array([[0., 0., 0., 0.],
[0., 0., 0., 0.]])
3.2. ones
ones
方法可以創建指定維度和類型的數組,數組的每個元素都是1。
一維,類型分別為int
和float
的數組。
import numpy as np
np.ones(5, dtype=int)
#>>> array([1, 1, 1, 1, 1])
np.ones(5, dtype=float)
#>>> array([1., 1., 1., 1., 1.])
不同維度的數組。
import numpy as np
np.ones((3,3), dtype=float)
#>>>
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
np.ones((2,4), dtype=float)
#>>>
array([[1., 1., 1., 1.],
[1., 1., 1., 1.]])
3.3. linspace
linspace
函數用來構建均勻分佈的數組。
比如,創建一個均勻分佈在0~1
之間的5
個值的數組。
import numpy as np
np.linspace(0, 1, 5)
#>>> array([0. , 0.25, 0.5 , 0.75, 1. ])
linspace
函數有個endpoint
屬性,用來控制是否包含最後一個元素。
下麵看看這個屬性設置之後的區別:
import numpy as np
np.linspace(0, 1, 5, endpoint=False)
#>>> array([0. , 0.2, 0.4, 0.6, 0.8])
#其結果相當於不加endpoint屬性時,
#平均分割成6份後取前5份
np.linspace(0, 1, 6)
#>>> array([0. , 0.2, 0.4, 0.6, 0.8, 1. ])
3.4. random
random
函數是隨機生成numpy
數組,也是使用最多的函數。
隨機生成值在0~1
之間的數組,可以指定任意維度:
import numpy as np
np.random.random((3, 3))
#>>>
array([[0.53058991, 0.72007309, 0.44017494],
[0.83616085, 0.65746936, 0.56416387],
[0.56300549, 0.63187035, 0.87307415]])
隨機生成值在 0~100
之間整數的數組,可以指定任意維度,
隨機值的範圍通過第一個和第二個參數指定。
import numpy as np
np.random.randint(0, 100, (3, 3))
#>>>
array([[24, 55, 62],
[79, 86, 3],
[14, 7, 63]])
隨機生成一個均值為0
,標準差為1
的符合正態分佈的數組,可以指定任意維度,
均值和標準差通過第一個和第二個參數指定。
np.random.normal(0, 1, (4, 3))
#>>>
array([[ 1.65321113, 1.19167512, -0.13037245],
[ 1.16451259, -0.58080834, 0.34491977],
[-0.77054092, -0.95344105, -0.12393142],
[-0.05896611, -1.25108846, -1.21772507]])
3.5. eye
eye
函數是用來創建單位矩陣的。
如果只有一個參數,創建的就是方陣。
np.eye(4)
#>>>
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
如果創建行列不一樣的矩陣,那麼,行和列哪個軸短,就以哪個為準生成方陣,其他值都是0
。
np.eye(2, 4)
#>>>
array([[1., 0., 0., 0.],
[0., 1., 0., 0.]])
np.eye(4, 2)
#>>>
array([[1., 0.],
[0., 1.],
[0., 0.],
[0., 0.]])
4. 總結回顧
本篇介紹了numpy
中最重要的概念--數組的相關知識。
包括數組的數據類型,主要是各種數值類型,
以及各類常用的創建方式(zeros,ones,linspace,random,eye)。
這些雖然簡單,卻是後續學習各種數組操作的基礎。