一、清單與數組
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.
是固定的,指的是
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站瞧一瞧?)