NumPy是机器学习中最常用的计算科学库,今天就来看看吧
NumPy简单介绍
- NumPy的简单介绍:
- NumPy是机器学习中一个数据分析的核心基础库;
- NumPy中最核心的数据类型就是
NumPy数组
(类似于MatLab中的矩阵),要求这个数组中的数据的数据类型必须保持一致; - 底层使用C、C++,Forturn语言实现,所以运算的效率是非常高的;
- NumPy的主要内容:
- NumPy数组的初始化;
- 花式索引,即高阶数组索引;
- 随机数组的生成
NumPy数组的使用:
-
NumPy数组的初始化:同一个NumPy数组中数据的数据类型最好保持一致:
- 1维数组:
import numpy as np arr1 = np.array([1, 2, 3, 4, 5]) # type(arr1)=numpy.ndarray(n dimension array) arr2 = np.array((1, 2, 3, 4, 5))
- 即使使用元组的方式创建一个数组,那么最终会自动转化成列表的形式
- 2维数组:
import numpy as np arr1 = np.array(<list>) arr2 = np.array(<list>)
- 初始化的时候给定数据类型
arr = np.array(<list>, dtype=int)
- 其中dtype可以是:bool,int,float,str,np.float32,np.float64,np.int32,np.int64···
- 生成一个新的数组返回
- 使用已经存在的NumPy数组初始化一个新的NumPy数组
arr = np.asarray(<nd-array>[, dtype=<data-type>])
- 如果<nd-array>和dtype都是一样的,就不会生成一个新的NumPy数组
- 使用astype生成新的NumPy数组
arr = <nd-array>.astype(<type>)
- 生成全0/1的NumPy数组
arr = <nd-array>.zeros/ones(<shape>)
- 这里的<shape>本质上就是一个n维元组,而且这个元组的括号必须带上
- 按照区间与步长结合生成NumPy数组
arr = np.arange([<start>, ]<end>[, <step>])
- 需要知道的是这个arange方法支持浮点数的生成
- arange生成也是前闭后开的
- 按照区间与生成个数结合生成NumPy数组
arr = np.linespace([<start>, ]<end>[, <shape>])
- linespace生成也是前闭后也是闭的
- <shape>默认是50
- 随机生成数组
arr = np.random.rand(<shape>) # 均匀分布 arr = np.random.randn(<shape>) # 高斯分布
- 1维数组:
-
NumPy数组的运算:
- 给ndarray的每个元素加一个数字a
arr = <nd-array> + a
- 列表是不支持这个
列表+数字
操作的;
- 列表是不支持这个
- 两个维度一样的ndarray相加:
arr = <nd-array1> + <nd-array2>
- 列表支持
列表+列表
的操作,其结果就是把两个列表的一级元素重新组合成一个新的列表;而两个维度一样的ndarray相加的结果就是这两个数组对应位置的数字相加形成新的数组,维度与其父母保持一致;
- 列表支持
- 给ndarray的每个元素乘以一个数字a:
arr = <nd-array> * a
- 列表是支持这个
列表*数字
操作,其结果就是a个列表相加的结果,而NumPy数组与一个数字相乘的结果是这个NumPy数组的每个元素乘以这个数字得到的结果;
- 列表是支持这个
- 两个维度一样的ndarray相乘:
arr = <nd-array1> + <nd-array2>
- 列表不支持支持
列表*列表
的操作;而两个维度一样的ndarray相乘的结果就是这两个数组对应位置的数字相乘形成新的数组,维度与其父母保持一致;
- 列表不支持支持
- 给ndarray的每个元素加一个数字a
-
NumPy数组的常用属性、方法:
- 获取NumPy数组的行列数:
<nd-array>.shape np.shape(<list>/<scalar>)
- 获取NumPy数组的维数:
<nd-array>.ndim
- 当参数为<scalar>的时候,返回的结果是一个空元组;
- 获取NumPy数组中数据的数据类型:
<nd-array>.dtype
- 获取NumPy数组中每个元素个数 ???高维???:
<nd-array>.size np.size(<list>)
- 获取NumPy数组中每个元素所占字节数:
<nd-array>.itemsize
- 获取NumPy数组所占字节数:
<nd-array>.nbytes
- 替换NumPy中的元素为一个新值:
<nd-array>.fill(<new-value>)
- 如果NumPy数组中的元素为一个虚数,获取其实部和虚部:
<nd-array>.imag <nd-array>.real
- 特殊值:无穷大和不是一个数字:
np.inf # 无穷大 np.nan # 不是一个数字
- 特殊值:无穷大和不是一个数字:
np.inf # 无穷大 np.nan # 不是一个数字
- NumPy数组求和:
- 全部的和
<nd-array>.sum()
- 所有列的和
<nd-array>.sum(axis=0)
- 所有行的和
<nd-array>.sum(axis=1)
- 全部的和
- NumPy数组求积:
<nd-array>.prod([axis=<num>])
- NumPy数组最小值:
<nd-array>.min([axis=<num>])
- NumPy数组求最大值:
<nd-array>.max([axis=<num>])
- NumPy数组求每行(1)/列(0)最大值的位置:
<nd-array>.argmax([axis=<num>])
- NumPy数组求每行(1)/列(0)最小值的位置:
<nd-array>.argmax([axis=<num>])
- NumPy数组求平均值:
<nd-array>.mean([axis=<num>])
- NumPy数组的转置:
<nd-array>.T
- 获取NumPy数组的行列数:
-
索引和切片
- 索引和切片的方式和列表用法一样,也有不一样的地方:
- 使用列表的方式访问多维数组
<nd-array>[<dimension1>, <dimension2>, ...]
- 获取二维数组的第n列数据
<nd-array>[:, n]
- 给已有的二维数组<nd-array>添加维度:
<nd-array>[:, :, None]
- 花式索引(Fancy Indexing):一次性从nd-array中根据索引获取多个值
// TODO
- 使用列表的方式访问多维数组
- 索引和切片的方式和列表用法一样,也有不一样的地方:
-
NumPy数组的遍历:
- 普通的遍历
for ele in <nd-array>: <for-body>
- n维NumPy数组全元素遍历:
for idx, ele in np.ndenumerate<nd-array>: <for-body>
- 普通的遍历
-
两个NumPy数组的拼接:
- 使用concatenate行(axis=0)/(axis=0)列拼接:
np.concatenate(<nd-array1>, <nd-array2>, [axis=<axis-value>])
- 注意,两个数组进行拼接的时候需要注意:若进行拼接,则列数必须相等,列拼接行数则必须相等;
- 使用
vstack
(行:垂直拼接)/hstack
(列:水平拼接)拼接:np.vstack(<nd-array1>, <nd-array2>) # 类似SQL中的 union np.hstack(<nd-array1>, <nd-array2>) # 类似SQL中的join np.dstack(<nd-array1>, <nd-array2>) # 结果是一个三维的变化结果,后面有时间讲解
- 使用concatenate行(axis=0)/(axis=0)列拼接:
-
NumPy数组的数学运算:
- NumPy数组的普通运算:
<nd-array1> +/-/*///**/% <num>
- NumPy数组作为矩阵的乘法:
<nd-array1>.dot(<num>/<nd-array2>) <nd-array1> @ (<num>/<nd-array2>) # 与.dot的结果一样,Python3以后支持
- NumPy数组的一些数学函数:
np.cos(<nd-array>) np.cos(<nd-array>) np.aqrt(<nd-array>) ...
- 注意, math模块的函数是无法直接作用于NumPy数组的
- NumPy数组的普通运算:
-
NumPy数组的逻辑运算:
- NumPy数组的普通逻辑运算:
<nd-array1> >/>=/</<= <num>
- 注意,逻辑运算的结果是一个数组,不能直接结合if使用,但是可以通过一些函数如:
if np.all/any/allclose(<nd-array-logic-expression>)
这种方式使用;
- 注意,逻辑运算的结果是一个数组,不能直接结合if使用,但是可以通过一些函数如:
- NumPy数组的普通逻辑运算:
-
NumPy数组的广播机制:
- 目前还不是很明白,研究明白之后补吧
// TODO
- 目前还不是很明白,研究明白之后补吧