前言
面試中特別重視對於數據結構的考查(某次面試被問及Python中列表和數組的區別,回答的不好,痛定思痛,紮實的基礎決定面試的成敗!)
本節簡要總結Python中數組、列表、元組、Numpy數組、Numpy矩陣的概念與聯繫。
1. 數組
- Python沒有數組!!!
2. 列表
- python內置類型,即動態數組,C++標準庫的vector,但可含不同類型的元素於一個list中。
- 下標:按下標讀寫,就當作數組處理,以0開始,有負下標的使用
- list的常用方法
- L.append(var) #追加元素
- L.insert(index,var)
- L.pop(var) #返回最後一個元素,並從list中刪除之
- L.remove(var) #刪除第一次出現的該元素
- L.count(var) #該元素在列表中出現的個數
- L.index(var) #該元素的位置,無則拋異常
- L.extend(list) #追加list,即合併list到L上
- L.sort() #排序
- L.reverse() #倒序
- 更多操作:Python 列表(list)操作
3. 元組
- tuple也是一個class,是不可變的list類型,不可以增刪改。
- 任意無符號的對象,以逗號隔開,默認爲元組。
- 詳細用法:python中元組(tuple)用法總結
與list的異同
異:
- 元組一旦創建不可改變,例如:aa=tuple(1,2,3);
- 元組不能追加(append)元素,彈出(pop)元素等;
- 只能對元組中的元素進行索引aa[0],不能對其中的元組進行賦值aa[0]=8;
- 使用元組的好處在於對元組進行操作更爲高效,適合存放一組常量;
同:
- 定義 tuple 與定義 list 的方式相同, 除了整個元素集是用小括號包圍的而不是方括號。
- Tuple 的元素與 list 一樣按定義的次序進行排序。 Tuples 的索引與 list 一樣從 0 開始, 所以一個非空 tuple 的第一個元素總是 t[0]。
- 負數索引與 list 一樣從 tuple 的尾部開始計數。
- 與 list 一樣分片 (slice) 也可以使用。注意當分割一個 list 時, 會得到一個新的 list ;當分割一個 tuple 時, 會得到一個新的 tuple。
用 Tuple 的好處
Tuple 比 list 操作速度快。如果您定義了一個值的常量集,並且唯一要用它做的是不斷地遍歷它,請使用 tuple 代替 list。
如果對不需要修改的數據進行 “寫保護”,可以使代碼更安全。使用 tuple 而不是 list 如同擁有一個隱含的 assert 語句,說明這一數據是常量。如果必須要改變這些值,則需要執行 tuple 到 list 的轉換。
Tuple 與 list 的轉換
Tuple 可以轉換成 list,反之亦然。從效果上看,tuple 凍結一個 list,而 list 解凍一個 tuple。
內置的 tuple 函數接收一個 list,並返回一個有着相同元素的 tuple。
a = [1, 2, 3]
tuple(a)
而 list 函數接收一個 tuple 返回一個 list。
a = (1, 2, 3)
list(a)
4. Numpy數組
- Numpy使用ndarray對象來處理多維數組,該對象是一個快速而靈活的大數據容器。
- 使用Python列表可以存儲一維數組,通過列表的嵌套可以實現多維數組。
# 使用列表創建二維數組
arr1 = [[1, 2], [3, 4]]
# 使用Numpy創建二維數組
import numpy as np
arr2 = np.array([[1, 2], [3, 4]])
爲什麼需要使用Numpy
- Numpy是專門針對數組的操作和運算進行了設計,所以數組的存儲效率和輸入輸出性能遠優於Python中的嵌套列表,數組越大,Numpy的優勢就越明顯。
- 通常Numpy數組中的所有元素的類型都是相同的,而Python列表中的元素類型是任意的,所以在通用性能方面Numpy數組不及Python列表,但在科學計算中,可以省掉很多循環語句,代碼使用方面比Python列表簡單的多。
另外,具體使用過程中:
(1)list不具有array的全部屬性(如維度、轉置等)
#eg1_1
import numpy as np
a = np.array([[1,2,0,1],[1,6,9,55],[7,8,9,5]])#a爲數組
print(a.T)
#Result:
[[ 1 1 7]
[ 2 6 8]
[ 0 9 9]
[ 1 55 5]]
#eg1_2
a = [[1,2,0,1],[1,6,9,55],[7,8,9,5]] #a爲列表
print(a.T)
#Result:
'list' object has no attribute 'T'
#eg1_3
import numpy as np
a=np.array([[1,2,3],[1,1,4],[1,5,1]])
print(a.shape)
#Result:
(3, 3)
#eg1_4
a=[[1,2,3],[1,1,4],[1,5,1]]
print(a.shape)
#Result
'list' object has no attribute 'shape'
(2)a[:m]的含義,a可以是列表或者數組,但是無論是哪種情況,a[:0]爲空
#eg2_1
import numpy as np
a=np.array([[4,1,2],
[7,4,10],
[12,17,88]])
#a=np.array([(4,1,2),
# (7,4,10),
# (12,17,88)]) 這兩個a中[和(不一樣,其實它們完全一樣
print(a[:0])
print(a[:1])
print(a[:2])
#Result:
[]
[[4 1 2]]
[[ 4 1 2]
[ 7 4 10]]
#eg2_1
a=[(4,1,2),(7,4,10),(12,17,88)]
print(a[:0])
print(a[:1])
print(a[:2])
#Result:
[]
[(4, 1, 2)]
[(4, 1, 2), (7, 4, 10)]
(3)array和list關於“==”的計算
#eg3_1
import numpy as np
a=np.array(['dog','cat','car'])
b=np.array(['dog','cat','trunk'])
acc = (np.mean(a == b))
print(acc)
#Result
0.6666666666666666
#eg3_2
import numpy as np
a=['dog','cat','car']
b=['dog','cat','trunk']
acc = (np.mean(a == b))
print(acc)
#Result
0.0
(4)array和list關於“*”的計算
from numpy import *
#a爲數組
a=array([[1,2,3],
[4,5,6]])
b=4*a
print(b)
[[ 4 8 12]
[16 20 24]]
from numpy import *
#a爲列表
a=([[1,2,3],
[4,5,6]])
b=4*a
print(b)
[[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]]
5. Numpy矩陣
Numpy數組和矩陣的區別:
- Numpy matrices必須是2維的,但是 numpy arrays (ndarrays) 可以是多維的(1D,2D,3D····ND). Matrix是Array的一個小的分支,包含於Array。所以matrix 擁有array的所有特性。
- 在numpy中matrix的主要優勢是:相對簡單的乘法運算符號。例如,a和b是兩個matrices,那麼a*b,就是矩陣積。
- matrix 和 array 都可以通過objects後面加.T 得到其轉置。但是 matrix objects 還可以在後面加 .H f得到共軛矩陣, 加 .I 得到逆矩陣。
- 相反的是在numpy裏面arrays遵從逐個元素的運算,所以array:c 和d的c*d運算相當於matlab裏面的c.*d運算。而矩陣相乘,則需要numpy裏面的dot命令 。
例如:
-
** 運算符的作用也不一樣 :因爲a是個matrix,所以a2返回的是a*a,相當於矩陣相乘。而c是array,c2相當於,c中的元素逐個求平方。
-
問題就出來了,如果一個程序裏面既有matrix 又有array,會讓人腦袋大。但是如果只用array,你不僅可以實現matrix所有的功能,還減少了編程和閱讀的麻煩。
-
當然你可以通過下面的兩條命令輕鬆的實現兩者之間的轉換:np.asmatrix和np.asarray
-
numpy 中的array與numpy中的matrix的最大的不同是,在做歸約運算時,array的維數會發生變化,但matrix總是保持爲2維。例如下面求平均值的運算.
參考
Python 列表(list)操作
python中元組(tuple)用法總結
python中的數組和列表
Python列表、Numpy數組與矩陣的區別