import numpy as np
导入 NumPy 库后,可通过np.+Tab键
查看可使用的函数,如果对其中一些函数的使用不是很清楚,还可以在对应函数加上?
,再运行,就可以很方便地看到如何使用函数的帮助信息。
输入np.
然后按 Tab 键,将出现如下界面:
图1:查看 NumPy 可以使用的函数
运行如下命令,便可查看函数 abs 的详细帮助信息。
np.abs?
NumPy 不但强大,而且还非常友好。下面将介绍Numpy的一些常用方法,尤其是与机器学习、深度学习相关的一些内容。
NumPy 封装了一个新的数据类型 ndarray(N-dimensional Array),它是一个多维数组对象。该对象封装了许多常用的数学运算函数,方便我们做数据处理、数据分析等。那么,如何生成 ndarray 呢?这里介绍生成 ndarray 的几种方式,包括:
- 从已有数据中创建;
- 利用 random 创建;
- 创建特定形状的多维数组;
- 利用 arange、linspace 函数生成等。
从已有数据中创建数组
直接对 Python 的基础数据类型(如列表、元组等)进行转换来生成 ndarray:
1) 将列表转换成 ndarray:
import numpy as np ls1 = [10, 42, 0, -17, 30] nd1 =np.array(ls1) print(nd1) print(type(nd1))
运行结果:
[ 10 42 0 -17 30]
<class 'numpy.ndarray'>
2) 嵌套列表可以转换成多维 ndarray:
import numpy as np ls2 = [[8, -2, 0, 34, 7], [6, 7, 8, 9, 10]] nd2 =np.array(ls2) print(nd2) print(type(nd2))
运行结果:
[[ 8 -2 0 34 7]
[ 6 7 8 9 10]]
<class 'numpy.ndarray'>
对于上面两个例子,也可以把列表换成元组,同样也适用。
利用 random 模块生成数组
在深度学习中,我们经常需要对一些参数进行初始化,因此为了更有效地训练模型,提高模型的性能,有些初始化还需要满足一定的条件,如满足正态分布或均匀分布等。这里介绍了几种 np.random 模块中常用的方法,如下表所示。
函数 | 描述 |
---|---|
np.random.random | 生成0到1之间的随机数 |
np.random.uniform | 生成均勻分布的随机数 |
np.random.randn | 生成标准正态的随机数 |
np.random.randint | 生成随机的整数 |
np.random.normal | 生成正态分布 |
np.random.shuffle | 随机打乱顺序 |
np.random.seed | 设置随机数种子 |
random_sample | 生成随机的浮点数 |
下面来看一些函数的具体使用:
import numpy as np nd3 =np.random.random([4, 3]) #生成4行3列的数组 print(nd3) print("nd3的形状为:",nd3.shape)
运行结果:
[[0.59115057 0.52022516 0.05992361]
[0.5077815 0.81313999 0.70061259]
[0.24654561 0.11705634 0.71399966]
[0.73964407 0.57138345 0.89284498]]
nd3的形状为: (4, 3)
为了每次生成同一份数据,可以指定一个随机种子,使用 shuffle() 函数打乱生成的随机数。
import numpy as np np.random.seed(123) nd4 = np.random.randn(4, 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]
[-2.42667924 -0.42891263 1.26593626]
[-0.8667404 -0.67888615 -0.09470897]]
随机打乱后数据:
[[-1.50629471 -0.57860025 1.65143654]
[-2.42667924 -0.42891263 1.26593626]
[-0.8667404 -0.67888615 -0.09470897]
[-1.0856306 0.99734545 0.2829785 ]]
<class 'numpy.ndarray'>
创建特定形状的多维数组
参数初始化时,有时需要生成一些特殊矩阵,如全是 0 或 1 的数组或矩阵,这时我们可以利用 np.zeros、np.ones、np.diag 来实现,如下表所示。
函数 | 描述 |
---|---|
np.zeros((3, 4)) | 创建 3×4 的元素全为 0 的数组 |
np.ones((3, 4)) | 创建 3×4 的元素全为 1 的数组 |
np.empty((2, 3)) | 创建 2×3 的空数组,空数据中的值并不为 0,而是未初始化的垃圾值 |
np.zeros_like(ndarr) | 以 ndarr 相同维度创建元素全为 0数组 |
np.ones_like(ndarr) | 以 ndarr 相同维度创建元素全为 1 数组 |
np.empty_like(ndarr) | 以 ndarr 相同维度创建空数组 |
np.eye(5) | 该函数用于创建一个 5×5 的矩阵,对角线为 1,其余为 0 |
np.full((3,5), 10) | 创建 3×5 的元素全为 10 的数组,10 为指定值 |
下面通过几个示例说明:
import numpy as np # 生成全是 0 的 3x3 矩阵 nd5 =np.zeros([3, 3]) # 生成全是 1 的 3x3 矩阵 nd6 = np.ones([3, 3]) # 生成 4 阶的单位矩阵 nd7 = np.eye(4) # 生成 4 阶对角矩阵 nd8 = np.diag([1, 8, 3, 10]) print("nd5 =/n", nd5) print("nd6 =/n", nd6) print("nd7 =/n", nd7) print("nd8 =/n", nd8)
运行结果:
nd5 =
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
nd6 =
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
nd7 =
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
nd8 =
[[ 1 0 0 0]
[ 0 8 0 0]
[ 0 0 3 0]
[ 0 0 0 10]]
有时还可能需要把生成的数据暂时保存到文件中,以备后续使用。
import numpy as np nd9 =np.random.random([3, 5]) np.savetxt(X=nd9, fname='./data.txt') nd10 = np.loadtxt('./data.txt') print(nd10)
运行结果:
[[0.1744383 0.15515217 0.74885812 0.57633094 0.06300636]
[0.24340527 0.65213913 0.07284238 0.52232677 0.58538849]
[0.83611286 0.76508018 0.26018483 0.20485587 0.95476232]]
打开当前目录下的 data.txt 也可以看到格式化的数据。
利用 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)) print(np.arange(0, 10)) print(np.arange(1, 4, 0.5)) print(np.arange(9, -1, -1))
运行结果:
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[1. 1.5 2. 2.5 3. 3.5]
[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() 的使用方法一样,读者不妨自己动手试一下。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/23604.html