官术网_书友最值得收藏!

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。

主站蜘蛛池模板: 黎城县| 巍山| 泸水县| 乌恰县| 兖州市| 本溪| 长岭县| 彭山县| 怀仁县| 怀来县| 缙云县| 大方县| 洛扎县| 抚松县| 白山市| 富蕴县| 当阳市| 博客| 克拉玛依市| 福清市| 巴彦淖尔市| 周宁县| 广德县| 和林格尔县| 霍山县| 婺源县| 河西区| 红河县| 怀集县| 德令哈市| 儋州市| 宣武区| 顺义区| 淮阳县| 左云县| 达孜县| 四子王旗| 和平县| 罗甸县| 高雄市| 扎鲁特旗|