- Python廣告數(shù)據(jù)挖掘與分析實戰(zhàn)
- 楊游云 周健
- 1350字
- 2021-04-02 14:21:20
3.1.3 數(shù)組運算
前面提到,NumPy的核心是多維數(shù)組ndarray。我們可以對數(shù)組ndarray進行多種變換和科學計算,并且可以在Python中通過將其他形式的數(shù)據(jù)轉(zhuǎn)換成數(shù)組以達到快速計算的目的,因為NumPy數(shù)組具有很多非常適合科學運算的特性,能大大提升計算的效率。
1.創(chuàng)建數(shù)組
創(chuàng)建數(shù)組最簡單的方法是使用array函數(shù)。它接收一切序列型的對象(包括其他數(shù)組),然后產(chǎn)生一個新的含有傳入數(shù)據(jù)的NumPy數(shù)組。下面以一個列表的轉(zhuǎn)換為例:
In [54]: data1 = [5.5,6.0,7,2,4.5] In [55]: array1 = np.array(data1) In [56]: array1 Out[56]: array([5.5, 6. , 7. , 2. , 4.5])
如果列表中又含有兩個或多個等長列表,也就是嵌套序列,那么轉(zhuǎn)換成數(shù)組后就會得到一個二維或多維數(shù)組。
In [57]: data2 =[[1,2,3],[4,5,6]]
In [58]: array2 = np.array(data2)
In [59]: array2
Out[59]:
array([[1, 2, 3],
[4, 5, 6]])
In [62]: data3 = [[[1,2,3],[4,5,6],[7,8,9]]]
In [63]: array3 = np.array(data3)
In [64]: array3
Out[64]:
array([[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]])
可以通過數(shù)組本身的屬性ndim(維度)和shape(形狀)兩種方法來判斷數(shù)組的維度。
In [65]: array2.ndim Out[65]: 2 In [66]: array2.shape Out[66]: (2, 3) In [67]: array3.ndim Out[67]: 3 In [68]: array3.shape Out[68]: (1, 3, 3)
由此可以看出,數(shù)組的維度是由構(gòu)成它的列表來決定的,也就是說NumPy數(shù)組array2和array3的維度shape分別由data2和data3決定。常用的數(shù)組維度是1維(1行n列)、2維(n行n列)、3維(n塊n行n列)。
除前面介紹的ndim和shape屬性外,我們常用的還有dtype屬性,用于判斷數(shù)組數(shù)據(jù)的類型。
In [69]: array1.dtype
Out[69]: dtype('float64')
In [70]: array2.dtype
Out[70]: dtype('int32')
可以看到,array1是float64(浮點數(shù)),array2是int32(整數(shù))。如果沒有特別指定,數(shù)據(jù)類型基本都是float64(浮點數(shù))。
前面我們是通過np.array來創(chuàng)建數(shù)組,除np.array之外,還有一些函數(shù)可以新建數(shù)組。比如,zeros和ones可以分別創(chuàng)建指定長度(形狀)的全0和全1數(shù)組,empty可以創(chuàng)建一個沒有具體含義值的數(shù)組。在使用這些方法創(chuàng)建多維數(shù)組時,只需傳入一個表示形狀的元組即可:
In [71]: np.zeros(5)
Out[71]: array([0., 0., 0., 0., 0.])
In [72]: np.ones((3,6))
Out[72]:
array([[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.]])
In [73]: np.empty((3,5,3))
Out[73]:
array([[[ 4.59257496e-316, 3.68273449e-316, 3.70849852e-306],
[-1.48085204e+108, 8.24866594e+141, 3.21820533e-085],
[ 2.21719207e-301, -4.16984184e+122, 3.88557708e-301],
[ 2.43359151e-301, 2.29323831e-301, 1.57162294e-181],
[ 3.88739986e-301, 2.43541431e-301, 2.29414970e-301]],
[[ 3.88928413e-008, 3.88922264e-301, 2.43678142e-301],
[ 3.71962406e-306, -1.71736520e+185, 3.89195681e-301],
[ 2.43951563e-301, 2.29642818e-301, 2.66613464e-056],
[-1.39297646e+214, 8.26652871e+141, 4.92090464e-037],
[ 3.89560237e-301, 2.44270555e-301, 2.29825096e-301]],
[[ 3.22677015e-032, 3.89742515e-301, 2.44407265e-301],
[ 2.29916235e-301, 2.11587939e-027, 3.89924793e-301],
[ 2.44543976e-301, 2.30007374e-301, 1.38743820e-022],
[ 3.90107071e-301, 2.44680687e-301, 2.30098513e-301],
[ 2.79137107e-109, 3.96177991e-297, 4.10074486e-322]]])
np.empty很多情況下返回的都是一些未初始化的值。所以,我們一般不建議使用np.empty函數(shù)來創(chuàng)建數(shù)組。
2.常用運算
NumPy可以對數(shù)組對象ndarray進行多種數(shù)學運算,其語法跟標量元素之間的運算一樣。
In [74]: data = np.array([[0.9,0.35,0.14,0.46],[0.53,0.78,0.12,0.86]])
In [75]: data
Out[75]:
array([[0.9 , 0.35, 0.14, 0.46],
[0.53, 0.78, 0.12, 0.86]])
數(shù)組的一個很重要的特點是,不需要編寫大量的循環(huán)語句就可以對數(shù)據(jù)執(zhí)行批量運算,并且在對大小相等的數(shù)組之間進行算術(shù)運算時都會將運算應用到元素級上,極大地提升了批量數(shù)據(jù)運算的效率。需要注意的是,ndarray是一個通用的同構(gòu)數(shù)據(jù)多維容器,也就是說,數(shù)組中的所有元素必須是相同數(shù)據(jù)類型的。
In [76]: data + data
Out[76]:
array([[1.8 , 0.7 , 0.28, 0.92],
[1.06, 1.56, 0.24, 1.72]])
In [77]: data - data
Out[77]:
array([[0., 0., 0., 0.],
[0., 0., 0., 0.]])
In [78]: data * data
Out[78]:
array([[0.81 , 0.1225, 0.0196, 0.2116],
[0.2809, 0.6084, 0.0144, 0.7396]])
In [79]: data / data
Out[79]:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.]])
此外,數(shù)組與標量之間的算術(shù)運算也會將標量值傳播到各個元素上。
In [80]: data * 2
Out[80]:
array([[1.8 , 0.7 , 0.28, 0.92],
[1.06, 1.56, 0.24, 1.72]])
In [81]: data + 3*data
Out[81]:
array([[3.6 , 1.4 , 0.56, 1.84],
[2.12, 3.12, 0.48, 3.44]])
In [82]: 3*data - data/2
Out[82]:
array([[2.25 , 0.875, 0.35 , 1.15 ],
[1.325, 1.95 , 0.3 , 2.15 ]])
以上是對數(shù)組的基礎運算的介紹,下面我們來看一下如何利用數(shù)組中的函數(shù)進行一些算術(shù)運算,其中常用的函數(shù)如表3-1所示。
表3-1 常用函數(shù)及相關說明
假設現(xiàn)在我們有一個新的數(shù)組data1,對data1分別使用以上幾種常用函數(shù)來計算結(jié)果,代碼如下。
In [83]: data1 = np.array([[-0.9,0.35,0.14,-0.46],[0.53,-0.78,-0.12,-0.86]])
In [84]: data1
Out[84]:
array([[-0.9 , 0.35, 0.14, -0.46],
[ 0.53, -0.78, -0.12, -0.86]])
In [85]: np.abs(data1)
Out[85]:
array([[0.9 , 0.35, 0.14, 0.46],
[0.53, 0.78, 0.12, 0.86]])
In [86]: np.sqrt(data1)
Out[86]:
array([[ nan, 0.59160798, 0.37416574, nan],
[0.72801099, nan, nan, nan]])
In [87]: np.square(data1)
Out[87]:
array([[0.81 , 0.1225, 0.0196, 0.2116],
[0.2809, 0.6084, 0.0144, 0.7396]])
In [88]: np.exp(data1)
Out[88]:
array([[0.40656966, 1.41906755, 1.1502738 , 0.63128365],
[1.69893231, 0.45840601, 0.88692044, 0.42316208]])
In [89]: np.log2(data1)
Out[89]:
array([[ nan, -1.51457317, -2.83650127, nan],
[-0.91593574, nan, nan, nan]])
In [90]: np.log10(data1)
Out[90]:
array([[ nan, -0.45593196, -0.85387196, nan],
[-0.27572413, nan, nan, nan]])
nan表示空值,表明數(shù)組元素在函數(shù)定義域內(nèi)無意義。為了返回結(jié)果的完整性,Python會默認返回一個空值nan。
- Building Computer Vision Projects with OpenCV 4 and C++
- 數(shù)據(jù)庫技術(shù)與應用教程(Access)
- PySpark大數(shù)據(jù)分析與應用
- 云計算服務保障體系
- 數(shù)據(jù)化網(wǎng)站運營深度剖析
- Microsoft Power BI數(shù)據(jù)可視化與數(shù)據(jù)分析
- “互聯(lián)網(wǎng)+”時代立體化計算機組
- 網(wǎng)站數(shù)據(jù)庫技術(shù)
- 云數(shù)據(jù)中心網(wǎng)絡與SDN:技術(shù)架構(gòu)與實現(xiàn)
- Oracle數(shù)據(jù)庫管理、開發(fā)與實踐
- 活用數(shù)據(jù):驅(qū)動業(yè)務的數(shù)據(jù)分析實戰(zhàn)
- Oracle高性能SQL引擎剖析:SQL優(yōu)化與調(diào)優(yōu)機制詳解
- 改進的群智能算法及其應用
- 數(shù)據(jù)庫原理及應用實驗:基于GaussDB的實現(xiàn)方法
- Discovering Business Intelligence Using MicroStrategy 9