1.1 生成Numpy数组
Numpy是Python的外部库,不在标准库中。因此,若要使用它,需要先导入Numpy。
import numpy as np
导入Numpy后,可通过np.+Tab键,查看可使用的函数,如果对其中一些函数的使用不是很清楚,还可以在对应函数+?,再运行,就可以很方便地看到如何使用函数的帮助信息。
输入np.然后按Tab键,将出现如下界面:
运行如下命令,便可查看函数abs的详细帮助信息。
np.abs?
Numpy不但强大,而且还非常友好。下面将介绍Numpy的一些常用方法,尤其是与机器学习、深度学习相关的一些内容。
Numpy封装了一个新的数据类型ndarray(N-dimensional Array),它是一个多维数组对象。该对象封装了许多常用的数学运算函数,方便我们做数据处理、数据分析等。那么如何生成ndarray呢?这里介绍生成ndarray的几种方式,如从已有数据中创建,利用random创建,创建特定形状的多维数组,利用arange、linspace函数生成等。
1.1.1 从已有数据中创建数组
直接对Python的基础数据类型(如列表、元组等)进行转换来生成ndarray:
1)将列表转换成ndarray:
import numpy as np lst1 = [3.14, 2.17, 0, 1, 2] nd1 =np.array(lst1) print(nd1) # [3.14 2.17 0. 1. 2. ] print(type(nd1)) # <class 'numpy.ndarray'>
2)嵌套列表可以转换成多维ndarray:
import numpy as np lst2 = [[3.14, 2.17, 0, 1, 2], [1, 2, 3, 4, 5]] nd2 =np.array(lst2) print(nd2) # [[3.14 2.17 0. 1. 2. ] # [1. 2. 3. 4. 5. ]] print(type(nd2)) # <class 'numpy.ndarray'>
如果把上面示例中的列表换成元组也同样适用。
1.1.2 利用random模块生成数组
在深度学习中,我们经常需要对一些参数进行初始化,因此为了更有效地训练模型,提高模型的性能,有些初始化还需要满足一定的条件,如满足正态分布或均匀分布等。这里介绍了几种常用的方法,如表1-1所示列举了np.random模块常用的函数。
表1-1 np.random模块常用函数
下面来看一些函数的具体使用:
import numpy as np nd3 =np.random.random([3, 3]) print(nd3) # [[0.43007219 0.87135582 0.45327073] # [0.7929617 0.06584697 0.82896613] # [0.62518386 0.70709239 0.75959122]] print("nd3的形状为:",nd3.shape) # nd3的形状为: (3, 3)
为了每次生成同一份数据,可以指定一个随机种子,使用shuffle函数打乱生成的随机数。
import numpy as np np.random.seed(123) nd4 = np.random.randn(2,3) print(nd4) np.random.shuffle(nd4) print("随机打乱后数据:") print(nd4) print(type(nd4))
输出结果:
[[-1.0856306 0.99734545 0.2829785 ] [-1.50629471 -0.57860025 1.65143654]]
随机打乱后数据:
[[-1.50629471 -0.57860025 1.65143654] [-1.0856306 0.99734545 0.2829785 ]]
1.1.3 创建特定形状的多维数组
参数初始化时,有时需要生成一些特殊矩阵,如全是0或1的数组或矩阵,这时我们可以利用np.zeros、np.ones、np.diag来实现,如表1-2所示。
表1-2 Numpy数组创建函数
下面通过几个示例说明:
import numpy as np # 生成全是 0 的 3x3 矩阵 nd5 =np.zeros([3, 3]) #生成与nd5形状一样的全0矩阵 #np.zeros_like(nd5) # 生成全是 1 的 3x3 矩阵 nd6 = np.ones([3, 3]) # 生成 3 阶的单位矩阵 nd7 = np.eye(3) # 生成 3 阶对角矩阵 nd8 = np.diag([1, 2, 3]) print(nd5) # [[0. 0. 0.] # [0. 0. 0.] # [0. 0. 0.]] print(nd6) # [[1. 1. 1.] # [1. 1. 1.] # [1. 1. 1.]] print(nd7) # [[1. 0. 0.] # [0. 1. 0.] # [0. 0. 1.]] print(nd8) # [[1 0 0] # [0 2 0] # [0 0 3]]
有时还可能需要把生成的数据暂时保存起来,以备后续使用。
import numpy as np nd9 =np.random.random([5, 5]) np.savetxt(X=nd9, fname='./test1.txt') nd10 = np.loadtxt('./test1.txt') print(nd10)
输出结果:
[[0.41092437 0.5796943 0.13995076 0.40101756 0.62731701] [0.32415089 0.24475928 0.69475518 0.5939024 0.63179202] [0.44025718 0.08372648 0.71233018 0.42786349 0.2977805 ] [0.49208478 0.74029639 0.35772892 0.41720995 0.65472131] [0.37380143 0.23451288 0.98799529 0.76599595 0.77700444]]
1.1.4 利用arange、linspace函数生成数组
arange是numpy模块中的函数,其格式为:
arange([start,] stop[,step,], dtype=None)
其中start与stop用来指定范围,step用来设定步长。在生成一个ndarray时,start默认为0,步长step可为小数。Python有个内置函数range,其功能与此类似。
import numpy as np print(np.arange(10)) # [0 1 2 3 4 5 6 7 8 9] print(np.arange(0, 10)) # [0 1 2 3 4 5 6 7 8 9] print(np.arange(1, 4, 0.5)) # [1. 1.5 2. 2.5 3. 3.5] print(np.arange(9, -1, -1)) # [9 8 7 6 5 4 3 2 1 0]
linspace也是numpy模块中常用的函数,其格式为:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
linspace可以根据输入的指定数据范围以及等份数量,自动生成一个线性等分向量,其中endpoint(包含终点)默认为True,等分数量num默认为50。如果将retstep设置为True,则会返回一个带步长的ndarray。
import numpy as np print(np.linspace(0, 1, 10)) #[0. 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556 # 0.66666667 0.77777778 0.88888889 1. ]
值得一提的是,这里并没有像我们预期的那样,生成0.1,0.2,...,1.0这样步长为0.1的ndarray,这是因为linspace必定会包含数据起点和终点,那么其步长则为(1-0)/9=0.11111111。如果需要产生0.1,0.2,...,1.0这样的数据,只需要将数据起点0修改为0.1即可。
除了上面介绍到的arange和linspace,Numpy还提供了logspace函数,该函数的使用方法与linspace的使用方法一样,读者不妨自己动手试一下。