本节介绍创建MATLAB数组和Python NumPy数组的各种方法,可以直接构造、用增量法构造,也可以使用专有函数构造特殊数组。[大谦MATLAB,dqmatlab点com]
直接构造数组
使用MATLAB中括号和Python中NumPy包的array函数可以直接创建一维和二维数组。
【MATLAB】
MATLAB中创建矩阵最简单的方法是使用中括号([])。在中括号内输入多个元素可以创建矩阵的一个行。用逗号或空格把每个元素间隔开:
row=[E1, E2, ..., Em] row=[E1 E2 ... Em]
下面用MATLAB和Python创建一个包含5个元素的一维数组:
>> A=[12 62 93 -8 22];
【Python】
Python中使用NumPy包的array函数创建NumPy数组。array函数的参数为列表等。
>>> import numpy as np
>>> a=np.array([12,62,93,-8,22])
>>> a
array([12, 62, 93, -8, 22])
如果想创建二维数组。
【MATLAB】
在中括号中用分号间隔各行数据:
A=[row1; row2; ...; rown]
下面创建一个3行5列的二维数组。注意,所有的行必须具有相同的元素个数:
>> A=[12 62 93 -8 22; 16 2 87 43 91; -4 17 -72 95 6]
A =
12 62 93 -8 22
16 2 87 43 91
-4 17 -72 95 6
【Python】
Python中array函数的参数设置为二维列表等。
>>> a=np.array([[12,62,93,-8,22],[16,2,87,43,91],[-4,17,-72,95,6]])
>>> a
array([[ 12, 62, 93, -8, 22],
[ 16, 2, 87, 43, 91],
[ -4, 17, -72, 95, 6]])
用增量法构造数组
增量法是常用的构造数组的方法,用增量法可以构造序列、等差数列和等比数列等。
通过构造序列构造一维数组
通过构造序列,可以用MATLAB和Python创建一维数组。
【MATLAB】
利用MATLAB提供的冒号运算符(first:last)可以生成一维数组。数组中的元素按顺序从first一直到last。默认序列是以增量方式生成的,后面的数比它前面的第一个数大1。
>> A=10:15
A =
10 11 12 13 14 15
【Python】
Python中使用NumPy包的arrange函数生成序列。
>>> x=np.arange(10,16)
>>> x
array([10, 11, 12, 13, 14, 15])
数组不必由正整数组成,也可以包括负值和小数。如
【MATLAB】
>> A=-2.5:2.5
A =
-2.5000 -1.5000 -0.5000 0.5000 1.5000 2.5000
【Python】
>>> A=np.arange(-2.5,3.5)
>>> A
array([-2.5, -1.5, -0.5, 0.5, 1.5, 2.5])
在默认情况下,MATLAB创建序列时增量总是为1,即使最后的值不是整数也行。如
【MATLAB】
>> A=1:6.3
A =
1 2 3 4 5 6
【Python】
>>> A=np.arange(1,6.3)
>>> A
array([1., 2., 3., 4., 5., 6.])
同样,冒号运算符生成的默认序列总是增序排列的(而不是减序排列的)。下面生成减序排列的数值序列,此时增量为负。
【MATLAB】
>> A=9:-1:1
A =
9 8 7 6 5 4 3 2 1
【Python】
>>> A=np.arange(9,0,-1)
>>> A
array([9, 8, 7, 6, 5, 4, 3, 2, 1])
实际上,在使用冒号运算符时可以指定增量步长值,比如创建一个10~50增量为5的数值序列:
【MATLAB】
>> A=10:5:50
A =
10 15 20 25 30 35 40 45 50
【Python】
>>> A=np.arange(10,51,5)
>>> A
array([10, 15, 20, 25, 30, 35, 40, 45, 50])
增量也可以是小数,比如,在下面的例子中增量为0.2:
【MATLAB】
>> A=3:0.2:3.8
A =
3.0000 3.2000 3.4000 3.6000 3.8000
【Python】
>>> A=np.arange(3,3.9,0.2)
>>> A
array([3. , 3.2, 3.4, 3.6, 3.8])
用linspace函数构造数组
用linspace函数法构造数组,需要指定首尾值和元素的总个数。其基本形式是:
【MATLAB】
x=linspace(first,last,num)
【Python】
x=np.linspace(first,last,num)
其中,first, last和num分别为x数组的首尾元素和元素个数。
下面在0和10之间等间隔取5个数。
【MATLAB】
>> x=linspace(0,10,5)
x =
0 2.5000 5.0000 7.5000 10.0000
可见,linspace函数构造的是等差数列。
【Python】
>>> x=np.linspace(0,10,5)
>>> x
array([ 0. , 2.5, 5. , 7.5, 10. ])
用logspace函数构造数组
linspace函数构造的是等差数列,用logspace函数法可以构造等比数列。该函数需要指定2-3个参数。其基本形式是:
【MATLAB】
x=logspace(first,last,num)
【Python】
x=np.logspace(first,last,num)
生成的数据中,第一个数为10^first,第二个数为10^last,数据个数为num。num参数可省略。
【MATLAB】
>> a=logspace(2,5,5)
a =
1.0e+05 *
0.0010 0.0056 0.0316 0.1778 1.0000
相邻数据的后一个数据除以前一个数据,结果都为5.6。所以,logspace函数生成的是等比数列。
【Python】
>> a=np.logspace(2,5,5)
>>> a
array([ 100. , 562.34132519, 3162.27766017, 17782.79410039,
100000. ])
构造特殊数组
MATLAB和Python NumPy包中都提供了多个创建不同矩阵的函数,利用这些函数可以构造各种特殊矩阵。
下面创建元素为服从均匀分布的随机数的矩阵,将每个元素乘以20:
【MATLAB】
>> A=rand(5)*20
A =
3.8686 13.9580 7.9310 13.2046 14.5423
13.6445 7.5675 17.9954 6.8394 6.1858
6.0553 17.2002 16.4326 5.7945 16.7699
7.8335 17.0731 12.8982 6.8239 11.3614
3.0175 11.8713 16.3595 7.6816 7.4083
【Python】
>>> A=np.random.rand(5,5)*20
>>> A
array([[ 3.34823053, 6.1743552 , 14.0462213 , 7.21925157, 6.04803982],
[17.22442301, 11.42752073, 3.76085514, 6.6982807 , 17.4194381 ],
[ 6.35364991, 14.1051616 , 2.91282597, 6.12719484, 3.92182789],
[ 7.07427377, 5.14687448, 5.6212404 , 5.44753161, 12.37276382],
[ 4.5275815 , 6.78547218, 5.61576384, 10.50932093, 7.04689399]])
用指定向量生成对角矩阵,将向量元素放在主对角线上。
【MATLAB】
>> A=[12 62 93 -8 22];
>> B=diag(A)
B =
12 0 0 0 0
0 62 0 0 0
0 0 93 0 0
0 0 0 -8 0
0 0 0 0 22
【Python】
>>> A=np.array([12,62,93,-8,22])
>>> B=np.diag(A)
>>> B
array([[12, 0, 0, 0, 0],
[ 0, 62, 0, 0, 0],
[ 0, 0, 93, 0, 0],
[ 0, 0, 0, -8, 0],
[ 0, 0, 0, 0, 22]])
下面根据向量元素创建对角矩阵。将向量元素放在主对角线的上方或下方,如下所示,其中-1表示将向量元素放在主对角线下方:
【MATLAB】
>> A=[12 62 93 -8 22];
>> B=diag(A, -1)
B =
0 0 0 0 0 0
12 0 0 0 0 0
0 62 0 0 0 0
0 0 93 0 0 0
0 0 0 -8 0 0
0 0 0 0 22 0
【Python】
>>> A=np.array([12,62,93,-8,22])
>>> B=np.diag(A,-1)
>>> B
array([[ 0, 0, 0, 0, 0, 0],
[12, 0, 0, 0, 0, 0],
[ 0, 62, 0, 0, 0, 0],
[ 0, 0, 93, 0, 0, 0],
[ 0, 0, 0, -8, 0, 0],
[ 0, 0, 0, 0, 22, 0]])
生成指定大小,元素全为0的矩阵。
【MATLAB】
>> A=zeros(4, 6, 'uint32')
A =
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
【Python】
>>> A=np.zeros([4,6],'uint32')
>>> A
array([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]], dtype=uint32)
生成指定大小,元素全为1的矩阵。
【MATLAB】
>> A=ones(4, 6, 'uint32')
A =
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
【Python】
>>> A=np.ones([4, 6], 'uint32')
>>> A
array([[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1]], dtype=uint32)
生成指定大小的单位矩阵。
【MATLAB】
>> A=eye(4)
A =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
【Python】
>>> A=np.eye(4,dtype='uint32')
>>> A
array([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]], dtype=uint32)
数组的长度和形状
使用特定的函数可以获取数组的长度和大小。
【MATLAB】
MATLAB中使用length函数计算数组的长度,用size函数计算数组的形状。
首先看一维数组的情况。创建一个一维数组,计算其长度和大小。
>> A=[12 62 93 -8 22];
>> length(A)
ans =
5
>> size(A)
ans =
1 5
所以,一维数组的长度是其元素的个数,大小中行或列有一个维度的长度为1。
再看一下二维数组的情况。创建一个二维数组,计算其长度和大小。
>> B=[12 62 93 -8 22; 16 2 87 43 91]
B =
12 62 93 -8 22
16 2 87 43 91
-4 17 -72 95 6
>> length(B)
ans =
5
>> size(B)
ans =
3 5
对于二维数组,length函数返回的是其列数,size函数返回它的行数和列数。
【Python】
Python中使用NumPy包的len函数计算数组的长度,用size函数计算数组的大小。
对于一维的情况:
>>> a=np.array([12,62,93,-8,22])
>>> len(a)
5
>>> np.size(a)
5
对于二维的情况:
>>> b=np.array([[12,62,93,-8,22],[16,2,87,43,91],[-4,17,-72,95,6]])
>>> len(b)
3
>>> np.size(b)
15
与MATLAB中不同的是,size函数返回的是数组中元素的总个数。