技术图文: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”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:

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