机器学习三剑客之numpy
Posted z-x-h
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习三剑客之numpy相关的知识,希望对你有一定的参考价值。
numpy库
简介
numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。
功能
- ndarray,一个具有矢量算数运算和复杂广播能力的快速且节省空间的多维数组。
- 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
- 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
- 线性代数,随机数生成以及傅里叶变换功能。
- 用于集成由C,C++,Fortran等语言编写的代码的工具。
具体分析
1.ndarry
创建ndarray:创建数组最简单的方法就是使用array函数,他接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的numpy数组,其中,嵌套序列(比如有一组等长列表组成的列表)将会别转换为一个多维数组。
除了np.array之外,还有一些函数可以新建数组:
- zeros和ones分别可以创建指定长度的全0或是全1数组。
- Empty可以创建一个没有任何具体值得数组。
import numpy as np a = [1, 2, 3, 4] b = np.array(a) # 将列表转换为数组 print(b) # [1 2 3 4] ar_zero = np.zeros([10, 10]) # 创建10行10列的数值为浮点0的矩阵 ar_ones = np.ones([10, 10]) # 创建10行10列的数值为浮点1的矩阵
数组是这样的ar_ones和ar_zeros
创建随机数组
均匀分布
arr = np.random.rand(10, 10) # 创建指定形状(例如10行10列)的数组(范围在0,1之间的小数) arr_r = np.random.uniform(0, 100) # 创建指定范围的一个数 arr_r_r = np.random.randint(0, 100) # 创建指定范围内的一个整数
正态分布
np.random.normal(1.75, 0.1, (2, 3)) # 给定均值/标准差/维度的正态分布
查看数组的属性的用法
ar_ones = np.ones([10, 10]) ar_ones.size # 数组元素个数 ar_ones.shape # 数组形状 ar_ones.ndim # 数组维度 ar_ones.dtype # 数组元素类型
2.数组和标量之间的运算
数组很重要,他可以使我们不编写循环即对数据执行批量运算,这就叫矢量化,大小相等的数组之间的任何算数运算都会讲运算应用到元素级,同样,数组与标量的算数运算会将那个标量值传到各个元素。
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
print(arr)
# [[1. 2. 3.]
# [4. 5. 6.]]
1/arr
# [[1. 0.5 0.33333333]
# [0.25 0.2 0.16666667]]
arr-arr
# [[0. 0. 0.]
# [0. 0. 0.]]
arr*arr
# [[ 1. 4. 9.]
# [16. 25. 36.]]
arr**0.5
# [[1. 1.41421356 1.73205081]
# [2. 2.23606798 2.44948974]]
3.基本的索引和切片
- 在二维数组中,各索引位置的元素不再是标量而是一维数组
- 可以对各个元素进行递归访问,但是有点麻烦。
- 可以传入一个一逗号隔开的索引列表来选取单个元素。
- 在多维数组中,如果省略了后面的索引,则返回对象会是一个维度低一点的nparray。
arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
arr3d
#[[[ 1 2 3]
# [ 4 5 6]]
# [[ 7 8 9]
# [10 11 12]]]
arr3d[0]
# [[1 2 3]
# [4 5 6]]
arr3d[0][1]
# [4 5 6]
arr3d[0, 1]
# [4 5 6]
4.数学和统计方法
? 基本数组统计方法
可以通过数组上的一组书写函数对整个数字或某个轴向的数据进行统计计算。
sum,mean以及标准差std等聚合计算既可以当做数组的实例方法调用,也可以当做顶级Numpy函数使用。
arr = np.random.randn(5, 4) #一个正态分布的数据 arr # [[ 0.95326975 0.77312101 -0.95214153 1.95996848] # [ 0.24917771 0.33556837 2.15445141 -1.25784532] # [-0.80319568 -0.9765313 0.36326416 -0.85973763] # [-1.71753049 1.26597532 -1.16980525 0.03452003] # [ 0.32723967 -1.09855723 -0.21926247 0.67971173]] arr.mean() # 0.002083038257278563 np.mean(arr) # 0.002083038257278563 arr.sum() # 0.041660765145571266
mean和sum这类的函数可以接受一个axis参数(用于计算该轴向上的统计值),最终结果是一个少一维的数组。
arr = np.random.randn(5, 4) arr.mean(axis=1) # [-0.7915737 0.90559043 0.07557592 -0.02567472 0.35097451] arr.sum(0) # [ 3.23951683 2.87480084 -2.95252202 -1.10222588]
其他如cumsum和cumprop之类的方法则不聚合,而是产生一个由中间结果组成的数组。
arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) arr.cumsum(0) # [[ 0 1 2] # [ 3 5 7] # [ 9 12 15]] arr.cumprod(1) # [[ 0 0 0] # [ 3 12 60] # [ 6 42 336]]
5.线性代数(不太懂 哈哈~~~)
线性代数(如矩阵乘法,矩阵分解,行列式以及其他方阵数学等)是是任何数组库的重要组成部分。
numpy提供了一个用于矩阵乘法的dot函数(既是一个数组方法,也是numpy命名空间中的一个函数)
x = np.array([[1., 2., 3.], [4., 5., 6.]]) y = np.array([[6., 23.], [-1, 7], [8, 9]]) x # [[1. 2. 3.] # [4. 5. 6.]] y # [[ 6. 23.] # [-1. 7.] # [ 8. 9.]] x.dot(y) # [[ 28. 64.] # [ 67. 181.]] np.dot(x, y) # [[ 28. 64.] # [ 67. 181.]]
numpy.linalg 中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西。
他们跟MATLIB和R等语言所使用的是相同的行业标准级Fortran库。
下面是常用的numpy.linalg函数:
以上是关于机器学习三剑客之numpy的主要内容,如果未能解决你的问题,请参考以下文章