文章目录
引言
Numpy的设计对于含有大量数组的数据非常有效。
- Numpy在内部将数据存储到连续的内存块上,这与python其他内建数据结构不同。Numpy的算法库是用C写的,所以在操作数据内存时,不需要任何类型检查或者其他管理操作。Numpy数组使用的内存量小于其他python内建序列。
- Numpy针对全量数组进行复杂计算而不需要写python循环。
4.1 ndarray:多维数组对象
4.1.1生成ndarray
数组生成函数如下:
4.1.2 ndarray的数据类型
ndarray的数据类型有如下:
可以用astype方法来转换数组类型
4.1.3 Numpy数组算术
数组允许进行批量操作而无须for循环。任何两个等尺寸数组之间的算术操作都应用了逐元素操作的形式。不同尺寸数组之间的操作将用到广播特性。
4.1.4基础索引与切片
一维数组比较简单,看起来与列表类似,不过也有区别。数组的切片是原数组的视图,这就意味着数据并不是被复制了,任何对视图的修改都会反馈到原数组上。
多维数组,省略后续索引值,返回的对象将是降低一个维度的数组。
切片索引:单独一个:表示该轴上的所有数组。
4.1.5布尔索引
在索引数组时可以传入布尔数组,布尔数组的长度必须和数组轴索引的长度一致。
常用符号有‘==’,‘!=’,‘~’(在条件表达式前取反)。
需要使用布尔算术运算符&和|来组合多个布尔值条件
基于常识设置布尔数组的值
4.1.6神奇索引
使用整数数组进行数据索引。当只有一个索引数组时,该数组是一个包含指明所需顺序的列表或者数组。
当传递进入的是多个数组时,会根据每个索引数组对应的元素选出一个一维数组。
神奇索引与切片不同,它总是将数组复制到一个新的数组中。
4.1.7数组转置与换轴
数组的转置:transpose方法与T属性
对于高维度数组,transpose方法,可以接收包含轴编号的元祖,用于置换轴。
4.2通用函数:快速的逐元素数组函数
一元通用函数
二元通用函数
4.3使用数组进行面向数组编程
向量化的数组操作比纯python的等价实现在速度上快一到两个数量级(甚至更多),这对所有种类的数值计算产生了很大影响。
4.3.1将条件逻辑作为数组操作
np.where函数是三元表达式x if cond else y 的向量化版本。向量化后速度更快,也适用于数组是多维的情况
np.where函数的第二个与第三个参数可以是标量
np.where函数的第二个与第三个参数也可以是将标量与数组联合
4.3.2基础数组统计方法
这些方法可接受一个可选参数axis,axis=0表示跨行计算,axis=1表示跨列计算
4.3.3布尔值数组的方法
对于布尔值数组,有两个非常有用的方法any和all。这两个方法也适用于布尔值数组,非0元素按照True处理。
any检查数组中是否至少有一个True
all检查数组中是否每个值都是True
4.3.4排序
数组可以用sort方法进行排序,可选参数axis,沿着axis轴对每一个一维数据进行排序。np.sort()方法返回的是已经排序好的数组的拷贝,而不是对原数组按位置排序。
4.3.5唯一值与其他集合逻辑
np.unique返回的是数组中唯一值排序后形成的数组。
np.in1d:检查一个数组中的值是否在另一个数组中,并返回一个布尔值数组
数组集合操作:
4.4使用数组进行文件输入和输出
numpy可以在硬盘中将数据以文本或二进制文件的形式进行存入硬盘或由硬盘载入。
np.save和np.load
可以使用np.savez将数组作为参数传递给该函数,用未压缩文件来保存多个数组
np.savez_compressed将数组存入已经压缩的文件
np.savetxt、np.loadtxt表示存取文本文件
4.5线性代数
numpy中*是逐元素相乘,而不是矩阵的点积。矩阵的点积是np.dot(x,y)或者特殊符号@
np.linalg标准函数集(矩阵分解)
4.6伪随机数的生成
np.random模块可以高效的生成多种概率分布下的完整样本值数组,弥补了python内建random模块的不足。