首页 > Numpy 阅读数:17

Numpy数组创建方式详解

在进行数学运算之前我们首先要创建数组,数组就是数的集合,其中的数按照一定的规则排序。比较常见的是二维数组,二维数组包含了行和列。

Numpy 中创建数组的方式主要有以下两种。
  • 创建元素为 0 或 1 的数组。
  • 将已有的数据转换为数组,比如将列表转换为数组。

1. 创建元素为0或1的数组

Numpy 提供了一些方法让我们创建元素全为 1 和 0,或者任意指定的数的数组。其中,empty 方法生成的元素是随机数。

In [1]: import numpy as np

1) empty()

empty 方法中传入 shape 参数来指定生成数组的形状,这里我们传入 (3,3) 用来生成一个 3 行 3 列的数组。
In [2]: np.empty(shape=(3,3))  # 创建一个3行3列的数组
Out[2]: 
array([[3.45845952e-323, 0.00000000e+000, 0.00000000e+000],
       [0.00000000e+000, 0.00000000e+000, 6.54142915e-321],
       [4.83245800e+276, 1.69600404e+161, 1.27849494e-152]]) 

2) eye()

eye 方法可以用来创建一个对角线元素全为 1 的数组,我们可以传入参数3来生成一个 3 行 3 列、对角线元素全为 1、其他元素全为 0 的数组。
In [3]: np.eye(3)  # 创建对角线元素全为1的二维数组
Out[3]: 
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]]) 

3) identity()

identity 方法用来创建单位矩阵,我们可以传入参数 3 来生成一个 3 行 3 列的单位矩阵。
In [4]: np.identity(3)  # 创建单位矩阵
Out[4]: 
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

4) ones()

ones 方法可以用来生成元素全部为1的数组,参数 shape 用来指定生成数组的形状,比如要生成一个 2 行 4 列的数组,我们就需要传入 (2,4) 作为参数。
In [5]: np.ones(shape=(2,4))  # 创建元素全为1的数组
Out[5]: 
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.]]) 

5) zeros()

同样地,还可以生成元素全部为0的数组,这里可以使用 zeros 方法,同样使用 shape 参数指定数组的形状。
In [6]: np.zeros(shape=(4,2))  # 创建元素全为0的数组
Out[6]: 
array([[0., 0.],
       [0., 0.],
       [0., 0.],
       [0., 0.]])

6) full()

full 方法是一个通用的方法。与 ones 方法和 zeros 方法不同的是,ones 方法是生成全部为 1 的数组,zeros 方法是生成全部为 0 的数组,而 full 方法则可以通过指定参数 fill_value 来生成指定元素的数组,比如生成一个元素全部为 2 的 3 行 3 列的数组。
In [7]: np.full(shape=(3,3),fill_value=2)  # 创建元素全为fill_value的3行3列的数组
Out[7]: 
array([[2, 2, 2],
       [2, 2, 2], 

2. 将列表转换为数组

有些时候,我们得到的数据并不是 Numpy 中数组的形式,此时可以通过 Numpy 中的 array 方法将其他形式的数据转换为 Numpy 中数组的形式,比如可以将 Python 中内置的 list 列表结构转换为数组。示例代码如下。

In [1]: import numpy as np

将列表 [1,2,3 ]转换为数组的形式。
In [2]: np.array([1,2,3])  # 创建一维数组
Out[2]: array([1, 2, 3]) 
将嵌套列表转换为二维数组。
In [3]: np.array([[1,2,3],
   ...:           [4,5,6]
   ...:           ]) # 创建二维数组
Out[3]: 
array([[1, 2, 3],
       [4, 5, 6]]) 

3. 生成一串数字

有些时候,我们需要生成一些连续的数字,Numpy 提供了相应的方法。注意这里我们称“生成一串数字”,而不是“生成一维数组”,因为生成的结果并没有维度的信息。

In [1]: import numpy as np 

1) arange()

arange 方法类似于 Python 中自带的 range 函数。参数 start 用来指定起始的值,参数 stop 用来指定结束的值,而参数 step 则用来指定步长,比如我们想要生成一个起始值为 1,终止值为 10,步长为 2 数组。
In [2]: np.arange(start=1,stop=10,step=2)  # 起始值为1,终止值为10,步长为2
Out[2]: array([1, 3, 5, 7, 9]) 

2) linspace()

linspace 方法也用来生成一个序列,与 arange 方法不同的是,它没有设置步长,而是设置了一个数。参 数 start 用来设置起始的值,参数 stop 用来设置结束的值,参数 num 用来设置一共生成多少个数。比如我们想要生成一个起始值为 1,终止值为 10,总共 5 个数的数组
In [3]: np.linspace(start=1,stop=10,num=5) # 起始值为1,终止值为10,总共5个数
Out[3]: array([ 1.  ,  3.25,  5.5 ,  7.75, 10.  ]) 

3) logspace()

logspace 方法类似于 linspace,不过是以 log 为刻度。
In [4]: np.logspace(start=1,stop=10,num=5)  # 类似于linspace,但是以log为刻度
Out[4]: 
array([1.00000000e+01, 1.77827941e+03, 3.16227766e+05, 5.62341325e+07,
       1.00000000e+10])

4. 创建特殊数组

我们还可以生成一些特殊的数组,比如根据对角线元素生成数组,或者提取数组的对角线元素等。

In [1]: import numpy as np 

1) 对角矩阵数组

diag 方法用来生成对角矩阵。diag方法传入的参数是列表,这个列表是生成数组的对角线元素,其他位置的元素全部为0。
In [2]: np.diag([1,2,3,4])  # 生成对角矩阵
Out[2]: 
array([[1, 0, 0, 0],
       [0, 2, 0, 0],
       [0, 0, 3, 0],
       [0, 0, 0, 4]])
diag 方法还可以将数组作为参数传入,这个时候 diag 方法的作用就是提取数组的对角线元素。
In [3]: np.diag([[1,2,3],
   ...:          [4,5,6],
   ...:          [7,8,9]])  # 提取对角线元素
Out[3]: array([1, 5, 9]) 

2) 三角矩阵数组

tri 方法可以用来生成三角矩阵。第 1 个参数是生成数组的行数,第 2 个参数是生成数组的列数,默认生成下三角矩阵。
In [4]: np.tri(3,5)  # 生成三角矩阵
Out[4]: 
array([[1., 0., 0., 0., 0.],
       [1., 1., 0., 0., 0.],
       [1., 1., 1., 0., 0.]]) 
tril 方法是根据已知的矩阵生成一个三角矩阵。第 1 个参数是一个数组,第 2 个参数是下三角矩阵的相对位置,-1 表示向下移动一个步长。
In [5]: np.tril([[1,2,3],
   ...:          [4,5,6],
   ...:          [7,8,9]],-1)#降位三角矩阵
Out[5]: 
array([[0, 0, 0],
       [4, 0, 0],
       [7, 8, 0]])
triu 方法和 tril 方法是相对的,它是用来生成上三角矩阵的。
In [6]: np.triu([[1,2,3],
   ...:          [4,5,6],
   ...:          [7,8,9]],-1)#升位三角矩阵
Out[6]: 
array([[1, 2, 3],
       [4, 5, 6],
       [0, 8, 9]])