技術圖文:Matlab向量 VS. Python列表

背景

前段時間在知識星球上立了一個Flag,至少寫10篇關於 Python,Matlab 和 C# 對比的總結。這是第 1 篇,從創建結構、添加元素、刪除元素、獲取元素四個角度來對比 Matlab 的向量與 Python 的列表。


1. 向量/列表 的創建

1.1 直接法

Matlab

>>  x = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
>> disp(x);
    "Monday"    "Tuesday"    "Wednesday"    "Thursday"    "Friday"

>> whos x
  Name      Size            Bytes  Class     Attributes

  x         1x5               398  string 

>> x = [2, 3, 4, 5, 6, 7];
>> disp(x);
     2     3     4     5     6     7

>> whos x
  Name      Size            Bytes  Class     Attributes

  x         1x6                48  double   

Python

x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(x, type(x))
# ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] <class 'list'>

x = [2, 3, 4, 5, 6, 7]
print(x, type(x))
# [2, 3, 4, 5, 6, 7] <class 'list'>

注:Matlab與Python直接創建向量/列表的方法是相同的,用[ ]括起來,元素用,分割。當然,Matlab中元素也可以用空格來分割。

1.2 等差數列法 – : VS range()

Matlab

>> x = 0:9;
>> disp(x)
     0     1     2     3     4     5     6     7     8     9

>> x = 1:2:9;
>> disp(x)
     1     3     5     7     9

>> x = 10:-2:1;
>> disp(x)
    10     8     6     4     2

Python

x = list(range(10))
print(x, type(x))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>

x = list(range(1, 11, 2))
print(x, type(x))
# [1, 3, 5, 7, 9] <class 'list'>

x = list(range(10, 1, -2))
print(x, type(x))
# [10, 8, 6, 4, 2] <class 'list'>

注:Matlab通過:構造的等差數列 左右 都是閉區間,而Python通過range()構造的等差數列是 左閉右開區間。


2. 向量/列表 的元素添加

Matlab

>> x = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
>> x = [x,"Thursday"];
>> disp(x)
    "Monday"    "Tuesday"    "Wednesday"    "Thursday"    "Friday"    "Thursday"

>> x = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
>> x(end+1) = "Thursday";
>> disp(x)
    "Monday"    "Tuesday"    "Wednesday"    "Thursday"    "Friday"    "Thursday"
    
>> x = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
>> x = [x, ["Thursday","Sunday"]];
>> disp(x)
    "Monday"    "Tuesday"    "Wednesday"    "Thursday"    "Friday"    "Thursday"    "Sunday"

>> x = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
>> x = [x(1:2),"Sunday",x(3:end)];
>> disp(x)
    "Monday"    "Tuesday"    "Sunday"    "Wednesday"    "Thursday"    "Friday"

>> x = [123, 456];
>> y = [456, 123];
>> z = [x, y];
>> disp(z)
   123   456   456   123

Python

x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.append('Thursday')
print(x)  
# ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Thursday']

x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.extend(['Thursday', 'Sunday'])
print(x)  
# ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Thursday', 'Sunday']

x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.insert(2, 'Sunday')
print(x)
# ['Monday', 'Tuesday', 'Sunday', 'Wednesday', 'Thursday', 'Friday']

x = [123, 456]
y = [456, 123]
z = x + y  # extend()
print(z)  
# [123, 456, 456, 123]

注:Matlab的添加元素直接在數組中進行,而Python添加元素是通過append()extend()insert()和運算符+來完成。


3. 向量/列表 的元素刪除

Matlab

>> x = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
>> x(x == "Monday") = [];
>> disp(x)
    "Tuesday"    "Wednesday"    "Thursday"    "Friday"

>> x = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
>> x(end) = [];
>> disp(x)
    "Monday"    "Tuesday"    "Wednesday"    "Thursday"

>> x(1) = [];
>> disp(x)
    "Tuesday"    "Wednesday"    "Thursday"

>> x(end -1) = [];
>> disp(x)
    "Tuesday"    "Thursday"

>> x = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
>> x([1,2]) = [];
>> disp(x)
    "Wednesday"    "Thursday"    "Friday"

Python

x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
x.remove('Monday')
print(x)  # ['Tuesday', 'Wednesday', 'Thursday', 'Friday']

x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
y = x.pop()
print(y)  # Friday

y = x.pop(0)
print(y)  # Monday

y = x.pop(-2)
print(y)  # Wednesday
print(x)  # ['Tuesday', 'Thursday']

x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
del x[0:2]
print(x)  # ['Wednesday', 'Thursday', 'Friday']

注:Matlab通過賦值空數組的方式來刪除元素,Python通過removepop和內置方法del來刪除元素。


4. 向量/列表 的元素獲取

Matlab

>> x = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
>> disp(x(1)+" "+class(x(1)))
Monday string

>> disp(x(end)+" "+class(x(end)))
Friday string

>> disp(x(end - 1)+" "+class(x(end - 1)))
Thursday string

>> disp(x(1:3))
    "Monday"    "Tuesday"    "Wednesday"

>> disp(x(1:end - 3))
    "Monday"    "Tuesday"
    
>> disp(x(2:2:end))
    "Tuesday"    "Thursday"

>> disp(x(1:2:end))
    "Monday"    "Wednesday"    "Friday"

>> disp(x(end:-1:1))
    "Friday"    "Thursday"    "Wednesday"    "Tuesday"    "Monday"

Python

  • 通過元素的索引值,從列表獲取單個元素,注意,列表索引值是從0開始的。
  • 通過將索引指定爲-1,可讓Python返回最後一個列表元素,索引 -2 返回倒數第二個列表元素,以此類推。
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(x[0], type(x[0]))  # Monday <class 'str'>
print(x[-1], type(x[-1]))  # Friday <class 'str'>
print(x[-2], type(x[-2]))  # Thursday <class 'str'>

切片的通用寫法是 start : stop : step

  • 情況 1 - “start :”
  • step 爲 1 (默認) 從編號 start 往列表尾部切片。
x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(x[3:])  # ['Thursday', 'Friday']
print(x[-3:])  # ['Wednesday', 'Thursday', 'Friday']
  • 情況 2 - “: stop”
  • step 爲 1 (默認) 從列表頭部往編號 stop 切片。
week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[:3])  # ['Monday', 'Tuesday', 'Wednesday']
print(week[:-3])  # ['Monday', 'Tuesday']
  • 情況 3 - “start : stop”
  • step 爲 1 (默認) 從編號 start 往編號 stop 切片。
week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[1:3])  # ['Tuesday', 'Wednesday']
print(week[-3:-1])  # ['Wednesday', 'Thursday']
  • 情況 4 - “start : stop : step”
  • 以具體的 step 從編號 start 往編號 stop 切片。注意最後把 step 設爲 -1,相當於將列表反向排列。
week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[1:4:2])  
# ['Tuesday', 'Thursday']

print(week[:4:2])  
# ['Monday', 'Wednesday']

print(week[1::2])  
# ['Tuesday', 'Thursday']

print(week[::-1])  
# ['Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday']

注:Matlab的:對應於Python的切片,只不過Matlab爲 start:step:stop而Python爲start:stop:step。Python相對於Matlab初始了默認值start=0stop=lenstep=1


總結

以上總結的不一定全,但先有個框架等後面在實踐的過程中慢慢補充。今天就到這裏吧。See You!


當前活動


我是 終身學習者“老馬”,一個長期踐行“結伴式學習”理念的 中年大叔

我崇尚分享,渴望成長,於2010年創立了“LSGO軟件技術團隊”,並加入了國內著名的開源組織“Datawhale”,也是“Dre@mtech”、“智能機器人研究中心”和“大數據與哲學社會科學實驗室”的一員。

願我們一起學習,一起進步,相互陪伴,共同成長。

後臺回覆「搜搜搜」,隨機獲取電子資源!
歡迎關注,請掃描二維碼:

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