天天看點

【資料分析與智能計算】第二章:NumPy庫與數組

一、清單與數組

Python的自帶資料類型中是不存在

數組

這一種類型的,而是自帶了一種和數組相類似的

清單

類型。

從某種程度上來說,清單仿佛比數組更加“強大”,因為清單裡的元素可以是任意類型的;并且類似于“多元數組”的概念我們也可以用“清單套清單”的方式實作。

不過,上述所謂的“強大”在數組的眼中隻不過是極度的“不規範”。我們需要一種新的資料類型

數組

,來保證其中所有的元素都是

,這樣我們才可以定義元素之間的四則運算,才可以定義數組之間的向量乘法、矩陣乘法等。這些事情是一個資料類型混雜的清單所不能完成的。

我們一般使用第三方庫

NumPy

中定義的

numpy.array

類作為我們的數組類型。

二、NumPy庫的使用

導入庫

NumPy庫是一個第三方庫,是以使用前需要先導入(大家一般将其重命名為

np

import numpy as np
           

執行個體化一個數組對象

要生成一個數組,無非就是要知道兩件事情:1.這個數組的名字是什麼? 2.這個數組裡面的數是什麼?

是以生成一個數組最簡單的方法便是

數組名 = np.ndarray(清單)

其中等号的右邊便是數組對象名,左邊括号裡填的是一個清單對象,清單裡的元素就轉換為數組裡的元素了。

array1 = np.array([1,2,3,4])
print(array1)
           
[1 2 3 4]
           

同樣地,如果要生成一個多元數組的話,我們隻需要“清單套清單”就行了

list2 = [[11,12],[21,22]] #最外層清單裡面又嵌套了一層清單
array2 = np.array(list2) #是以生成的是一個二維數組
print(array2)
print('array2的次元是:', array2.ndim)
           
[[11 12]
 [21 22]]
array2的次元是: 2
           
list3 = [[[111,112,113],[121,122,123],[131,132,133]],
         [[211,212,213],[221,222,223],[231,232,233]],
         [[311,312,313],[321,322,323],[331,332,333]]] #最外層清單裡面嵌套了一層清單又套了一層清單
array3 = np.array(list3) #是以生成的是一個三維數組
print(array3)
print('array3的次元是:', array3.ndim)
           
[[[111 112 113]
  [121 122 123]
  [131 132 133]]

 [[211 212 213]
  [221 222 223]
  [231 232 233]]

 [[311 312 313]
  [321 322 323]
  [331 332 333]]]
array3的次元是: 3
           
array4 = np.arange(0,16).reshape(2,2,2,2) #用arange()和reshape()函數生成一個4維數組
print(list4)
print('array4的次元是:', array4.ndim)
           
[[[[ 0  1]
   [ 2  3]]

  [[ 4  5]
   [ 6  7]]]


 [[[ 8  9]
   [10 11]]

  [[12 13]
   [14 15]]]]
array4的次元是: 4
           

NumPy對高次元的數組有着很好的支援。從上面的例子中我們可以看到數組的顯示也是很直覺的:不論次元有多高,它都會用方括号來嚴格表示層級關系,并且對于二維數組來說,它會自動排列成一個二維的表格;對于更高維的數組來說,它會把最内層的兩個次元排成二維表格,然後再用中括号以區分層級。

常用的函數、屬性

表一 常用庫函數

函數 作用

np.array(清單)

通過清單建立一個數組對象

np.arange(起始, 結束, 步長)

建立一個等差數組(注意區間是左閉右開的)

np.zeros( (m, n) )

建立一個

m

n

列的全零數組

np.ones( (m, n) )

建立一個

m

n

列的全一數組

np.eye(m)

建立一個

m

階機關方陣

表二 常用對象屬性

屬性 作用

my_array.ndim

傳回

my_array

的維數

my_array.size

傳回

my_array

的總元素數

my_array.shape

以元組形式傳回

my_array

(行, 列)

my_array.dtype

傳回

my_array

中元素的資料類型

*注意庫函數和對象屬性的不同,表一中

np.

是固定的,指的是

numpy庫

;而表二中

my_array.xxx()

中的

my_array

要改成你對應的數組的名字(即執行個體名)。

切片

我們将選出一個數組的某一行、某一列或者某一個位置上的元素的操作成為“切片”

我們先來讨論二維數組的切片:

最基本的格式是:

my_array[m, n]

,其中

m

n

可以為

整數

清單

還可以是冒号

:

m

n

是整數時,表示選取

m

n

列的那個數。

m

n

其中一個是冒号的時候,表明選中對應的所有行或列。例如

my_array[ :, n]

表示選擇整個第

n

特别需要注意的是,當

m

n

是清單時,設

m

n

的長度是

k

,則我們選取的是

k

個坐标分别為(mi, ni)的散點(而不是k2個交叉點)如:

arr = np.arange(1,10).reshape(3,3)
print('切片前:')
print(arr)
m = [0,1]
n = [1,2]
print('切片後:')
print(arr[m, n])
           
切片前:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
切片後:
[2 6]
           

我們可以看到,我們選取了的是位于(0,1)和(1,2)位置的兩個數

2

6

,而不是位于

0行

1行

1列

2列

交叉點處的4個數

2

,

3

,

5

,

6

那麼如果我想選出指定行和指定列的交叉點所在的數該怎麼辦呢?

我們需要通過“二次切片”來實作。如:

print('二次切片:')
print(arr[ m, : ][ :, n ]
           
二次切片:
[[2 3]
 [5 6]]
           

這時候我們就得到了

0行

1行

1列

2列

交叉點處的4個數

2

,

3

,

5

,

6

三、小結

這一期部落格我們首先讨論了數組與清單的關系及異同。數組的特點在于其中的元素的資料類型是統一的,這使得我們能夠友善地進行後期的資料處理。

在Python中我們一般使用NumPy庫來建立數組,它給我們提供了很多的庫函數、方法、屬性,讓我們在對數組進行操作的時候更加友善。

然後我們介紹了如何建立一個數組,并且也看到了NumPy對高次元的數組有着很好的支援。

我們還對常用的函數、屬性總結成了兩個表格,友善大家查閱。

最後我們介紹了“切片”這一對于數組來說最基本也是最重要的操作。

關于數組的更多的操作和例子我們放到下一期部落格中,通過講解書上的例題和課後習題來一起讨論。

如果你正在學習/複習“資料分析與智能計算”這門課,或者是想要入門大資料、人工智能的同學,歡迎訂閱本專欄~

覺得有用的話,不要忘了點贊、關注、分享哦~大家多多包涵,有任何問題歡迎指正、讨論。

本文基于CC-BY-NC-SA 4.0協定,請規範轉載。

(部落格看累了?去我的B站瞧一瞧?)