【记录】MATLAB|Python NumPy|两种语言的数组/矩阵中元素修改方式的总结和对比
文章目錄
- 二維矩陣
- 操作
- 1. 將數(shù)組大于0的數(shù)全部加1
- 2. 刪除元素
- ①刪除單個元素
- ②刪除一列元素
- 3. 添加一行或多行
- ①添加一行
- ②添加多行
- 4. 獲取行/列數(shù)
- 5. 格式化輸出數(shù)組
- 結(jié)構(gòu)數(shù)組
- 操作
- 1. 篩選i小于1的元素
- 2. 格式化輸出結(jié)構(gòu)數(shù)組中的數(shù)組
二維矩陣
以二維矩陣a為例。
1 matlab:
a=[1 -2 3;-4 5 0]; % 定義矩陣a
disp(a); % 打印矩陣a
結(jié)果:
2 python:
import numpy as np
a = np.array([[1, -2, 3],[4, 5, 0]]) # 定義矩陣a
print (a) # 打印矩陣a
結(jié)果:
操作
1. 將數(shù)組大于0的數(shù)全部加1
1 matlab:
a(a>0)=a(a>0)+1;
同理,只要改括號內(nèi)的條件,就可以修改其他元素。
2 python:
使用Numpy的內(nèi)置索引。
a[a>0]=a[a>0]+1
2. 刪除元素
①刪除單個元素
1 matlab:
a(2)=[];
注意索引從1開始,并且順序如下:
刪除后:1 -2 5 3 0。
2 python:
a = np.delete(a, 2)
索引從0開始,順序如下:
刪除后:1 -2 4 5 0。
②刪除一列元素
1 matlab:
a(:,2)=[];
:表示選擇所有行,2表示選擇第二列的元素,綜合起來表示刪除第2列。
2 python:
a = np.delete(a, 2, 1)
刪除第3列。第三個參數(shù)為1時刪除列,為0刪除行。
其余刪除操作同理。
3. 添加一行或多行
①添加一行
1 matlab:
row=[1 2 3];
a=[a;row];
2 python:
可用append或insert。
row = np.array([1, 2, 3])
a = np.append(a,[row],axis= 0)
#a = np.insert(a, 2, row, axis=0) # 插入成為第3行
同樣地,第三個參數(shù)為1時列操作,為0行操作。
②添加多行
1 matlab:
row=[1 2 3;2 4 5;7 8 9];
a=[a;row];
2 python:
row = np.array([[1, 2, 3],[2, 4, 5],[7, 8, 9]])
a = np.append(a,row,axis= 0)
#a = np.insert(a, 2, row, axis=0) # 插入成為第3行
注意中括號[]。
4. 獲取行/列數(shù)
1 matlab:
[row,line]=size(a); % 行,列
row=size(a,1); % 行
line=size(a,2); % 列
2 python:
(row, line) = a.shape # 行,列
row = a.shape(0) # 行
line = a.shape(1) # 列
5. 格式化輸出數(shù)組
1 matlab:
對于數(shù)值數(shù)組、字符數(shù)組或字符串?dāng)?shù)組,可用mat2str:
a=mat2str(a); % mat格式轉(zhuǎn)換成字符串
a=strrep(a,' ',','); % 將空格替換成,符號
a=strrep(a,';','],['); % 將分號替換成"],["
disp(a);
mat2str也支持?jǐn)?shù)字有效位數(shù)設(shè)定,不展開講了,感興趣見mat2str(Convert matrix to characters)_MathWorks。
自定義性更高的遍歷輸出:
for row=1:size(a,1)
fprintf("[");
for line=1:size(a,2)
fprintf("%d",a(row,line));
if(line==size(a,2))
fprintf("]");
else
fprintf(",");
end
end
if(row==size(a,1))
fprintf("\n");
else
fprintf(",");
end
end
結(jié)果均為:
2 python:
a = np.array2string(a, separator=',') # 用逗號作為分隔符
a = a.replace('\n','') # 去除換行
print (a)
結(jié)果:
參考:stackoverflow_string-representation-of-a-numpy-array-with-commas-separating-its-elements
設(shè)置np輸出元素格式可用np.set_printoptions。
不展開講了。感興趣見“numpy.set_printoptions_NumPy 1.22 中文”。
結(jié)構(gòu)數(shù)組
以結(jié)構(gòu)數(shù)組s為例。
1 matlab:
row=4; % 行數(shù)
line=1; % 列數(shù)
s(row,line) = struct('i',0,'F',0.1,'Matrixs',[]); % 定義三個元素
% 只初始化第二個元素
s(2).i=2;
s(2).F=0.2;
s(2).Matrixs=[1 2 3;4 5 6];
disp(s);
結(jié)果:
可以看到,最開始初始化的元素,只對最后一個元素生效,也就是元素s(row,line)。所以不要想著用這種方式直接初始化。可以循環(huán)初始化。
2 python:
import numpy as np
type = np.dtype({'names':['i','F','Matrixs'],'formats':['i4','f8','(4,3)i4']})
s = np.rec.array([(0, 0.1, [[0,0,0],[0,0,0],[0,0,0],[0,0,0]])]*4, dtype=type)
s[1].i=2;
s[1].F=0.2;
s[1].Matrixs=[[1,2,3],[4,5,6],[0,0,0],[0,0,0]]
print (s)
numpy貌似不支持創(chuàng)建形狀不確定的子數(shù)組,就像c語言里創(chuàng)建數(shù)組需要提前告知數(shù)組總大小一樣(這里我開辟的是4*3)。
但matlab類型根本不用自己定義,隨便加什么都可以,這波我站matlab。
結(jié)果:
操作
1. 篩選i小于1的元素
1 matlab:
s=s([s.i]<1); % 注意中括號
注意,當(dāng)結(jié)構(gòu)數(shù)組中有未定義的[]時,該篩選方法可能出錯,請保證空值已經(jīng)賦值完畢。
出錯樣例如:
s=s([s.i]>0);
得到的結(jié)果是:
這是因?yàn)?code>[]在matlab中是空值,[s.i]會自動刪掉空值,在本例中只剩下兩項(xiàng)2 0,大于0的是2,索引是1。但1對應(yīng)的實(shí)際元素是s(1),而不是s.i==2的s(2)。
2 python:
s=s[s.i<1]
結(jié)果:
2. 格式化輸出結(jié)構(gòu)數(shù)組中的數(shù)組
1 matlab:
對于結(jié)構(gòu)數(shù)組中的數(shù)組,我尚未想到一次性完整提取其中所有數(shù)組的方式,可循環(huán)提取再輸出:
for i=1:size(s,1)
a=mat2str(s(i).Matrixs); % mat格式轉(zhuǎn)換成字符串
a=strrep(a,' ',','); % 將空格替換成,符號
a=strrep(a,';','],['); % 將分號替換成"],["
disp(a);
end
結(jié)果:
2 python:
a = np.array2string(s.Matrixs, separator=',') # 用逗號作為分隔符
a = a.replace('\n','') # 去除換行
print (a)
python不用循環(huán),稍微方便一些。
如果以后還用到別的,再補(bǔ)充。
總結(jié)
以上是生活随笔為你收集整理的【记录】MATLAB|Python NumPy|两种语言的数组/矩阵中元素修改方式的总结和对比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Number of Atoms——Lee
- 下一篇: 【记录】博客|Markdown写作常用的