NumPy 创建数组

0 元素矩阵

np.zeros

np.zeros 可以用来创建以 0 为元素的矩阵,它的语法如下,

np.zeros(shape, dtype=float, order='C')

其中 shape 就是所要生成的矩阵的尺寸,可以为一维,二维和多维。数据类型默认为 float64,当然你可以指定具体的其他数据类型。

我们来创建几个零元素矩阵

>>> import numpy as np
>>> np.zeros(5)		# 生成一个元素为 5 个 0 的一维矩阵
array([0., 0., 0., 0., 0.])
>>> np.zeros(5, dtype='int8')	#生成一个元素为 5 个 0 的一维矩阵,数据类型为 int8
array([0, 0, 0, 0, 0], dtype=int8)
>>> np.zeros((4, 3)) # 生成一个 4 行 3 列的零矩阵
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

np.empty

有些情况下,你只是想初始化一个矩阵为指定尺寸的矩阵,对里面的初始化数据并不关心,那你可以使用 np.empty 来实现更快的初始化,但要注意的一点时,它并不保证里面的数据为 0。

我们可以通过%timeit 来具体比较下 np.empty()np.zeros() 的执行时间,

In [1]: %timeit np.empty((100, 100))
    715 ns ± 11.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [2]: %timeit np.zeros((100, 100))
    4.03 µs ± 104 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

很明显的,np.empty() 在初始化的时候要比 np.zeros() 快得多,在矩阵尺寸为 (100, 100) 的测试条件下,它只需要大约 17.5%的时间。

np.zeros_like

假如有些情况下,我们已经有一个矩阵,我们想生成一个跟它具有相同尺寸的零矩阵,我们可以用传统的方法来创建,

test = np.array([[1,2,3],[4,5,6],[7,8,9]])
np.zeros(test.shape)

或者我们可以用 NumPy 的另外一个函数 np.zeros_like() 直接来生成,效率更高。

x = np.zeros_like(test)
注意
np.zeros_like() 的形状跟输入矩阵一样,而且数据类型也是一样的。

1 元素矩阵

np.ones

同理,我们也可以快速生成元素全为 1 的矩阵,np.ones() 的用法和输入参数跟 np.zeros() 的完全一致。

>>> import numpy as np
>>> np.ones(5)		# 生成一个元素为 5 个 1 的一维矩阵
array([1., 1., 1., 1., 1.])
>>> np.ones(5, dtype='int8')	#生成一个元素为 5 个 1 的一维矩阵,数据类型为 int8
array([1, 1, 1, 1, 1], dtype=int8)
>>> np.ones((4, 3)) # 生成一个 4 行 3 列的元素为 1 的矩阵
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

np.ones_like

np.zeros_like 一样,np.ones_like 可以用来更高效的生成与输入矩阵具有相同形状的元素为 1 的矩阵。

>>> test = np.array([[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]])
>>> np.ones_like(test)
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

对角矩阵

对角矩阵是对角线上元素为 1,其他位置元素为 0 的矩阵。可以通过 np.eye() 函数来生成此类型矩阵,它的语法如下

np.eye(N, M=None, k=0, dtype=<class 'float'>, order='C')

其中,

参数名称 数据类型 摘要
N INT 指定生成的矩阵的行数。
M INT (可选)缺省值为 None。 指定要生成的矩阵的列数。当它为 None 时,它变为与 N 相同的值。
k INT (可选)缺省值为 0。 0 为主对角线位置,如果 k 的值为正,则 1 元素向上平移 k 次,如果 k 为负,则 1 元素向下平移 k 次,
dtype 数据类型 (可选)缺省值为 float 指定生成的数组的元素的数据类型。

np.eye() 举例

>>> import numpy as np
>>> np.eye(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
>>> np.eye(4, 3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.],
       [0., 0., 0.]])
>>> np.eye(3, 4)
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.]])
>>> np.eye(4, k=1)
array([[0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.],
       [0., 0., 0., 0.]])

np.identity()

np.identity 可以被看成是一种特殊的 np.eye,它用来生成的矩阵是一个方阵,也就是行列数相等的矩阵。语法如下,

numpy.identity(n, dtype = float)
参数名称 数据类型 说明
n INT 指定要生成的矩阵的大小。生成 N×N 方阵。
dtype 数据类型 (可选)缺省值为 float。 指定元素的数据类型。

np.identity() 举例

>>> import numpy as np
>>> np.identity(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

三角矩阵

可以通过 np.tri() 来生成三角矩阵,函数调用语法如下,

numpy.tri(N, M=None, k=0, dtype=<class 'float'>)

其输入参数跟 np.eye() 类似,可以作为参考。

np.tri() 举例

>>> import numpy as np
>>> np.tri(3)
array([[1., 0., 0.],
       [1., 1., 0.],
       [1., 1., 1.]])
>>> np.tri(4, k=1)
array([[1., 1., 0., 0.],
       [1., 1., 1., 0.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])