1.Numpy优势
-
Numpy介绍
Numpy是一个开源的Python科学计算库,用于快速处理任意维度的数组。Numpy支持常见的数组和矩阵操作,对于同样的数值计算任务,使用Numpy比之间使用Python要简洁的多。
Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
-
ndarray介绍
Numpy提供了一个N维数组类型ndarray,它描绘了相同类型的“items”的集合。ndarray的数组底层经过优化,比使用Python原生的数组更快更迅速。但ndarray中所有的数据元素必须要统一类型,这也是ndarray的一大特点。
由于机器学习的最大特点就是大量的数据运算,因此ndarray很适合这种应用场景。
2.N维数组ndarray
-
ndarray的属性
属性名称 介绍 ndarray.shape 返回数组维度的元组 ndarray.ndim 返回数组维数 ndarray.size 返回数组中元素的数量 ndarray.itemsize 返回一个数组元素的长度,以字节为单位 ndarray.dtype 返回数组元素的类型 -
ndarray的类型
通过type(ndarray.dtype)获得数组对应的类型名称 描述 简写 np.bool 布尔类型,True or Flase ‘b’ np.int8 一个字节大小, − 2 7 -2^7 −27 ~ 2 7 − 1 2^7 - 1 27−1 ‘i’ np.int16 整数类型, − 2 15 -2^{15} −215 ~ 2 15 − 1 2^{15} - 1 215−1 ‘i2’ np.int32 整数类型, − 2 31 -2^{31} −231 ~ 2 31 − 1 2^{31} - 1 231−1 ‘i4’ np.int64 整数类型, − 2 63 -2^{63} −263 ~ 2 63 − 1 2^{63} - 1 263−1 ‘i8’ np.uint8 无符号整数类型, 0 0 0 ~ 2 8 − 1 2^{8} - 1 28−1 ‘u’ np.uint16 无符号整数类型, 0 0 0 ~ 2 16 − 1 2^{16} - 1 216−1 ‘u2’ np.uint32 无符号整数类型, 0 0 0 ~ 2 32 − 1 2^{32} - 1 232−1 ‘u4’ np.uint64 无符号整数类型, 0 0 0 ~ 2 64 − 1 2^{64} - 1 264−1 ‘u8’ np.float16 半精度浮点数类型,阶码5位,尾数10位 ‘f2’ np.float32 单精度浮点数类型,阶码8位,尾数23位 ‘f4’ np.float64 双精度浮点数类型,阶码11位,尾数52位 ‘f8’ np.complex64 单精度浮点复数类型 ‘c8’ np.complex128 双精度浮点复数类型 ‘c16’ np.object_ Python对象类型 ‘O’ np.string_ 字符串类型 ‘S’ np.unicode_ Unicode类型 ‘U’ 可以在创建元素时通过dtype属性指定ndarray的类型,如:
a = np.array([1,2,3], dtype=np.float32)若不指定,则整数默认为int64,小数默认float64
3.基本操作
3.1数组生成
-
生成0-1数组:
# 生成全1数组 np.ones(shape[, dtype]) # 例:生成4行3列的全1数组 ones = np.ones([4, 3]) # 生成全0数组 np.zeros(shape[, dtype]) # 例:生成4行3列的全0数组 zeros = np.zeros([4, 3]) -
从现有数组生成:
# 深拷贝 np.array(object, dtype) # 示例: a = np.array([1,2,3],[4,5,6]) # 浅拷贝 np.asarray(object, dtype) # 示例: a1 = np.asarray(a) -
生成固定范围的数组:
-
创建指定数量的等差数组
np.linspace(start, stop, num, endpoint)
参数:- start:序列的起始位置
- stop:序列的终止位置
- num:要生成的等间隔样例数量,默认为50
- endpoint:序列是否包含stop位置的值,默认为True
# 生成等间隔数组 np.linspace(0, 100, 11) -
创建指定步长的等差数组
np.arange(start, stop, step, dtype)
参数:- step:步长,默认为1
# 生成指定步长的数组 np.arange(10, 50, 2) -
创建以10为底的等比数列
np.logspace(start, stop, num)
参数:- num:等比数列的元素数量,默认50
# 获取1, 10, 100 np.logspace(0, 2, 3)
-
-
生成随机数数组:
-
正态分布随机数组的创建
-
np.random.randn(d0, d1,…,dn)用于从标准正态分布中返回一个或多个样本值 -
np.random.normal(loc, scale, size)模拟正态分布,loc为均值,scale为标准差,size为数组形状# 例1:生成均值为1.75标准差为1的一维正态随机数组10000000个 np.random.normal(1.75, 1, 10000000) # 例2:随机生成4支股票1周的交易日涨幅数据 np.random.normal(0, 1, (4, 5)) -
np.random.standard_normal(size)返回指定形状的标准正态分布数组
-
-
均匀分布随机数组的创建
np.random.rand()返回 [ 0 , 1 ) [0 , 1) [0,1)内的一组均匀分布的数np.random.uniform(low, high, size)从一个均匀分布 [ l o w , h i g h ) [low, high) [low,high)中随机采样np.random.randint(low, high, size, dtype)从一个随机分布中随机抽样,生成一个整数或N维整数数组
-
3.2数组的基本操作
-
数组的索引、切片:
可以使用Python原生的索引、切片方式,此处不再赘述 -
形状修改:
-
返回一个具有相同数据域,但shape不一样的视图
ndarray.reshape(shape) -
修改数组本身的形状
ndarray.resize(shape) -
数组(矩阵)转置
ndarray.T
-
-
类型修改:
- 返回修改类型后的数组
ndarray.astype(type) - 构造包含数组中原始数据字节的Python字节
ndarray.tostring()或ndarray.tobytes()
- 返回修改类型后的数组
-
数组去重:
np.unique(ndarray)将ndarray中的元素去重,返回一个数组
3.3ndarray运算
-
逻辑运算:
# 生成10名同学,5门功课的数据 score = np.random.randint(40, 100, (10, 5)) # 取出最后4位同学的成绩,用于逻辑判断 test_score = score[6:] # 逻辑判断,如果成绩不小于60标记为True,否则为False print(test_score > 60) # Bool赋值,将满足条件的设置为指定的值-布尔索引 test_score[test_score > 60] = 1 print(test_score) -
通用判断函数:
-
np.all()
# 判断前两名同学成绩是否全部及格 np.all(score[:2] > 60) # 返回False -
np.any()
# 判断前两名同学成绩是否有大于90分的 np.any(score[:2] > 90) # 返回True
-
-
三元运算np.where:
# 将前四名学生的前4门成绩中,及格的设为1,不及格的设为0 temp = score[:4, :4] np.where(temp >= 60, 1, 0) # 类似C语言中的三元运算符 ? : -
复合逻辑的运算:
需要借助np.logical_and()和np.logical_or()# 将前四名学生的前4门成绩中,及格但不是优秀[60,90)的设为1,不及格的设为0 temp = score[:4, :4] np.where(np.logical_and(temp >= 60, temp < 90), 1, 0) # 将前四名学生的前4门成绩中,不及格或优秀![60,90)的设为1,不及格的设为0 np.where(np.logical_or(temp < 60, temp >= 90), 1, 0) -
统计运算:
数据挖掘/机器学习领域中常用的统计指标:(axis=1时统计行;axis=0时统计列;默认统计全部)np.min(ndarray, axis)计算最小值np.argmin(ndarray, axis)计算最小值的索引np.max(ndarray, axis)计算最大值np.argmax(ndarray, axis)计算最大值的索引np.median(ndarray, axis)计算中位数np.mean(ndarray, axis, dtype)计算平均数np.std(ndarray, axis, dtype)计算标准差np.var(ndarray, axis, dtype)计算方差
3.4数组的运算
-
数组与数的运算
arr = np.array([1, 2, 3, 2, 1, 4]) print(arr + 1) # [2 3 4 3 2 5] 所有元素都加1 print(arr / 2) # [0.5 1. 1.5 1. 0.5 2.] 所有元素都除以2 -
数组间的运算
数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制。该机制会对数组进行扩展,使数组的shape属性值一样,这样才能进行矢量化运算arr1 = np.array([[0],[1],[2],[3]]) arr2 = np.array([1, 2, 3]) print(arr1.shape) # (4,1) 四行一列 print(arr2.shape) # (3,) 一行三列 print(arr1 + arr2) # [[1,2,3],[2,3,4],[3,4,5],[4,5,6]] 四行三列广播机制实现了两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只要满足如下任意一个条件即可:
- 数组的某一维度等长
- 其中一个数组的某一维度为1
广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算
3.5 矩阵运算
-
矩阵乘法API
- np.matmul
- np.dot
二者区别:np.matmul中禁止矩阵与标量的乘法。在矢量乘矢量的内积运算中,np.matmul与np.dot没有区别
Numpy:高效数组处理与科学计算
本文介绍了Numpy库如何加速Python中的数值计算,重点讲解了ndarray对象、多维数组操作、基本运算、广播机制、矩阵运算及其在数据处理中的应用。
510

被折叠的 条评论
为什么被折叠?



