【Python】Python中的數組、列表、元組、Numpy數組、Numpy矩陣

前言

面試中特別重視對於數據結構的考查(某次面試被問及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數組和矩陣的區別:

  1. Numpy matrices必須是2維的,但是 numpy arrays (ndarrays) 可以是多維的(1D,2D,3D····ND). Matrix是Array的一個小的分支,包含於Array。所以matrix 擁有array的所有特性。
  2. 在numpy中matrix的主要優勢是:相對簡單的乘法運算符號。例如,a和b是兩個matrices,那麼a*b,就是矩陣積。
  3. matrix 和 array 都可以通過objects後面加.T 得到其轉置。但是 matrix objects 還可以在後面加 .H f得到共軛矩陣, 加 .I 得到逆矩陣。
  4. 相反的是在numpy裏面arrays遵從逐個元素的運算,所以array:c 和d的c*d運算相當於matlab裏面的c.*d運算。而矩陣相乘,則需要numpy裏面的dot命令 。

例如:
在這裏插入圖片描述
在這裏插入圖片描述

  1. ** 運算符的作用也不一樣 :因爲a是個matrix,所以a2返回的是a*a,相當於矩陣相乘。而c是array,c2相當於,c中的元素逐個求平方。
    在這裏插入圖片描述

  2. 問題就出來了,如果一個程序裏面既有matrix 又有array,會讓人腦袋大。但是如果只用array,你不僅可以實現matrix所有的功能,還減少了編程和閱讀的麻煩。

  3. 當然你可以通過下面的兩條命令輕鬆的實現兩者之間的轉換:np.asmatrix和np.asarray

  4. numpy 中的array與numpy中的matrix的最大的不同是,在做歸約運算時,array的維數會發生變化,但matrix總是保持爲2維。例如下面求平均值的運算.
    在這裏插入圖片描述
    在這裏插入圖片描述

參考
Python 列表(list)操作
python中元組(tuple)用法總結
python中的數組和列表
Python列表、Numpy數組與矩陣的區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章