创建数组

本节介绍创建MATLAB数组和Python NumPy数组的各种方法,可以直接构造、用增量法构造,也可以使用专有函数构造特殊数组。[大谦MATLAB,dqmatlab点com]

直接构造数组

使用MATLAB中括号和Python中NumPy包的array函数可以直接创建一维和二维数组。

【MATLAB】

MATLAB中创建矩阵最简单的方法是使用中括号([])。在中括号内输入多个元素可以创建矩阵的一个行。用逗号或空格把每个元素间隔开:

row=[E1, E2, ..., Em] row=[E1 E2 ... Em]

下面用MATLAB和Python创建一个包含5个元素的一维数组:

code.matlab
>> A=[12 62 93 -8 22];

【Python】

Python中使用NumPy包的array函数创建NumPy数组。array函数的参数为列表等。

code.python
>>> import numpy as np
>>> a=np.array([12,62,93,-8,22])
>>> a
array([12, 62, 93, -8, 22])

如果想创建二维数组。

【MATLAB】

在中括号中用分号间隔各行数据:

code.matlab
A=[row1; row2; ...; rown]

下面创建一个3行5列的二维数组。注意,所有的行必须具有相同的元素个数:

code.matlab
>> 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函数的参数设置为二维列表等。

code.python
>>> 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。

code.matlab
>> A=10:15
A =
    10    11    12    13    14    15

【Python】

Python中使用NumPy包的arrange函数生成序列。

code.python
>>> x=np.arange(10,16)
>>> x
array([10, 11, 12, 13, 14, 15])

数组不必由正整数组成,也可以包括负值和小数。如

【MATLAB】

code.matlab
>> A=-2.5:2.5
A =
   -2.5000   -1.5000   -0.5000    0.5000    1.5000    2.5000

【Python】

code.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】

code.matlab
>> A=1:6.3
A =
     1     2     3     4     5     6

【Python】

code.python
>>> A=np.arange(1,6.3)
>>> A
array([1., 2., 3., 4., 5., 6.])

同样,冒号运算符生成的默认序列总是增序排列的(而不是减序排列的)。下面生成减序排列的数值序列,此时增量为负。

【MATLAB】

code.matlab
>> A=9:-1:1
A =
   	9	8	7	6	5	4	3	2	1

【Python】

code.python
>>> A=np.arange(9,0,-1)
>>> A
array([9, 8, 7, 6, 5, 4, 3, 2, 1])

实际上,在使用冒号运算符时可以指定增量步长值,比如创建一个10~50增量为5的数值序列:

【MATLAB】

code.matlab
>> A=10:5:50
A =
    10    15    20    25    30    35    40    45    50

【Python】

code.python
>>> A=np.arange(10,51,5)
>>> A
array([10, 15, 20, 25, 30, 35, 40, 45, 50])

增量也可以是小数,比如,在下面的例子中增量为0.2:

【MATLAB】

code.matlab
>> A=3:0.2:3.8
A =
    3.0000    3.2000    3.4000    3.6000    3.8000

【Python】

code.python
>>> A=np.arange(3,3.9,0.2)
>>> A
array([3. , 3.2, 3.4, 3.6, 3.8])

用linspace函数构造数组

用linspace函数法构造数组,需要指定首尾值和元素的总个数。其基本形式是:

【MATLAB】

code.matlab
x=linspace(first,last,num)

【Python】

code.python
x=np.linspace(first,last,num)

其中,first, last和num分别为x数组的首尾元素和元素个数。

下面在0和10之间等间隔取5个数。

【MATLAB】

code.matlab
>> x=linspace(0,10,5)
x =
         0    2.5000    5.0000    7.5000   10.0000

可见,linspace函数构造的是等差数列。

【Python】

code.python
>>> x=np.linspace(0,10,5)
>>> x
array([ 0. ,  2.5,  5. ,  7.5, 10. ])

用logspace函数构造数组

linspace函数构造的是等差数列,用logspace函数法可以构造等比数列。该函数需要指定2-3个参数。其基本形式是:

【MATLAB】

code.matlab
x=logspace(first,last,num)

【Python】

code.python
x=np.logspace(first,last,num)

生成的数据中,第一个数为10^first,第二个数为10^last,数据个数为num。num参数可省略。

【MATLAB】

code.matlab
>> a=logspace(2,5,5)
a =
   1.0e+05 *
    0.0010    0.0056    0.0316    0.1778    1.0000

相邻数据的后一个数据除以前一个数据,结果都为5.6。所以,logspace函数生成的是等比数列。

【Python】

code.python
>> a=np.logspace(2,5,5)
>>> a
array([   100.        ,    562.34132519,   3162.27766017,  17782.79410039,
       100000.        ])

构造特殊数组

MATLAB和Python NumPy包中都提供了多个创建不同矩阵的函数,利用这些函数可以构造各种特殊矩阵。

下面创建元素为服从均匀分布的随机数的矩阵,将每个元素乘以20:

【MATLAB】

code.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】

code.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】

code.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】

code.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】

code.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】

code.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】

code.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】

code.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】

code.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】

code.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】

code.matlab
>> A=eye(4)
A =
        1        0        0        0
        0        1        0        0
        0        0        1        0
        0        0        0        1

【Python】

code.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函数计算数组的形状。

首先看一维数组的情况。创建一个一维数组,计算其长度和大小。

code.matlab
>> A=[12 62 93 -8 22];
>> length(A)
ans =
     5
>> size(A)
ans =
     1	5

所以,一维数组的长度是其元素的个数,大小中行或列有一个维度的长度为1。

再看一下二维数组的情况。创建一个二维数组,计算其长度和大小。

code.matlab
>> 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函数计算数组的大小。

对于一维的情况:

code.python
>>> a=np.array([12,62,93,-8,22])
>>> len(a)
5
>>> np.size(a)
5

对于二维的情况:

code.python
>>> 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函数返回的是数组中元素的总个数。