创建数组
- py中的list每一项包含值及值的相关信息,对于数值运算显然不够高效
- py中的array模块只支持一维数组,也没有各种运算函数,np数组包含同一类型值,可指定多维
import numpy as np #导入模块 np.array([range(i,i+3) for i in [2,4,6]]) #生成二维数组 np.zero(10,dtype = int) #生成包含数个0的整型数组 np.ones((3,5),dtype=float) #生成3x3浮点型矩阵 #注意指定行列(3,5)不能写成(3x5) np.full((3,5),3.14) #生成3x5矩阵,元素全为3.14 np.arange(0,20,2) #类似于内置的range()函数 np.linspace(0,1,5) #将5个元素均分到0~1区间内 np.random.random((3,3)) #生成3x3随机数矩阵,范围0~1 np.random.normal(0,1,(3,3)) #生成正态分布矩阵,均值0,方差1 np.random.randint(0,10,(3,3)) #生成3x3随机整型矩阵,区间(0,10) np.eye(3) #生成单位矩阵 np.empty(3) #3个整型组成的未初始化的数组(数值是内存空间中的任意值)
numpy标准数据类型
numpy数组基础
- 基本数组操作:
- 数组的属性 确定数组的大小(size)、形状、存储大小、数据类型。
- 数组的索引 获取和设置数组各个元素的值。
- 数组的切分 在大的数组中获取或设置更小的子数组。
- 数组的变形 改变给定数组的形状。
- 数组的拼接和分裂 将多个数组合并为一个,以及将一个数组分裂成多个
numpy数组属性
- 属性
- nidm(数组的维度)
- shape(数组每个维度的大小)
- size(数组的总大小)
- dtype(数组的数据类型)
- itemsize(示每个数组元素字节大小)
- nbytes(组总字节大小)
- 索引:与py中list相同,多维数组中括号内用逗号分隔,注意numpy数组是固定类型,将浮点数插入整型数组是浮点值被截短成整型,不会有报错或者警告
- 数组切片:获取子数组(与py中相同 数组切片返回的是数组数据的视图而非数值数据的副本
#反转 [1]list(reversed(x)) [2]x[::-1]#start和stop参数默认是被交换的 [3]sorted(x,reverse=True) #没隔*个元素 x[1::2]#从索引1开始,每隔一个元素
多维数组中,获取行可以忽略列
- 非副本视图的子数组
通过copy()实现
x[0].copy() #修改子数组,原始数组不会被改变
- 数组的变形reshape()、newaxis关键字
- reshape():原始数组的大小必须和变形后数组的大小一致
- newaxis:将一个一维数组转变成二维的行或列
- 数组的拼接和分裂
-
拼接:主要由 np.concatenate、np.vstack 和 np.hstack 例程实现
- np.concatenate()
np.concatenate([x,x])#默认沿着第一个轴拼接 np.concatenate([grid, grid], axis=1)#沿着第二个轴拼接
- np.vstack([,])
- np.hstack([,])
- np.dstack([,])
- np.concatenate()
-
分裂: np.split、np.hsplit 和 np.vsplit
-
numpy数组的计算:通用函数
- 绝对值
- abs(x)/ np.abs(x)/ np.basolute(x)
- 处理复数时,返回值是复数的幅度
- 三角函数
- np.sin()/..
- np.arcsin()/..
- 指数和对数
- 指数:np.exp(x)/ np.exp2(x)/ np.power(3,x)
- 对数:np.log(x)/ np.log2(x)/ np.log10(x)
- 特殊版本:expm1(x)/ np.log1p(x)可以保持较好的精确
- 双曲三角函数/比特位运算/比较运算/弧度角度转化运算/取整/求余...
- 专用通用函数:scipy.special
- 特性
- 指定输出
- 通过out参数指定结果存放位置(对于较大的数组,慎用out可有效节约内存
- np.power(2,x,out=y[::2])#输出视图
- y[::2] = 2 ** x#创建临时数组
- 聚合
- 外积
- 用 outer 方法获得两个不同输入数组所有元素对的函数运算结 果
- ufunc.at
- ufunc.reduceat
- 广播
- 指定输出
聚合
- 求和
- np.sum(x)与py中的sum()语法相似,因为 NumPy 的 sum函数在编译码中执行操作,所以 NumPy 的操作计算得更 快一些。
- sum函数和np.sum函数并不等同,它们各自的可选参数都有不同的含义。
- 最大值最小值:同样与py内置函数语法相似,np对应函数指
- 简洁形式:数组对象直接调用聚合方法。
- 多维度聚合:通过axis指定沿哪个轴的方向进行聚合
注:axis关键字指定的是数组将会被折叠的维 度,而不是将要返回的维度
- np中可用的聚合函数
广播
- 用于不同大小数组的二进制通用函数(加、减、乘等)的一组规则
- 对于相同大小的数组,二进制操作是对相应元素的逐个计算;广播允许二进制操作用于不同大小的数组
- 对值得重复实际上并没有发生
- 一个数组被广播:
- 对两个数组同时广播
广播的规则:决定两个数组间的操作
- 规则 1:如果两个数组的维度数不相同,那么小维度数组的形状将会在最左边补 1。
- 规则 2:如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度 为 1 的维度扩展以匹配另外一个数组的形状。
- 规则 3:如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于 1, 那么会引发异常
广播的应用
- 数组归一化
- 利用 mean 函数沿着第一个维度聚合
- 数组的元素中减去这个均值实现归一化
- 核对:查看归一化的数组的均值是否接近 0
- 画一个二维函数(基于二维函数显示图像。)
比较、掩码和布尔逻辑
- 比较操作返回布尔类型数组
- 可以利用复合表达式实现对两个数组的逐元素比较
- 可用于任何形状/大小的数组
示例:
In[1]:rng = np.random.RandomState(0) #伪随机数生成器:用确定性的算法计算出来类似来自[0,1]均匀分布的随机数序列。具有类似于随机数的统计特征 s = rng.randint(10,size=(3,4)) #在rng下使用可以得到相同的伪随机数 x Out[1]:array([[5, 0, 3, 3], [7, 9, 3, 5], [2, 4, 7, 6]]) In[2]:x < 6 Out[2]: array([[ True, True, True, True], [False, False, True, True], [ True, True, False, False]], dtype=bool)
操作布尔数组
- 统计记录的个数
- np.count_nonzero(expression)
- np.sum(expression)
- True被解释成1,False被解释成0
- 可以沿着列或行进行(通过axis参数)
- np.any():是否存在,可以沿着列或行进行(通过axis参数)
- np.all():是否全部,可以沿着列或行进行(通过axis参数)
- 布尔运算符
将布尔数组作为掩码
- 掩码:通过与目标函数进行按位运算,达到屏蔽指定位而实现需求
- 关键字and/or与逻辑操作运算符&/|
- and 和or判断整个对象是真或假,使用 and 或 or 时,就等于让 Python 将这个对象当作整个布尔实体。
- & 和 | 是指每个对象中的比特位,你对整数使用&和|时,表达式操作的是元素的比特,将and或or应用于组成该数 字的每个比特。
- 当数组可以被当作是由比特字符组成的,且1=True,0=False。这样的数组可以进行 & 和 | 的操作。
- 对给定数组进行逻辑运算时,也应该使用 | 或 &,而不是 or 或 and。
- and和or对整个对象执行单个布尔运算,而&和|对一个对象的内容(单个比特或字节)执行多个布尔运算。
花哨的索引
- 花哨的索引:传递一个索引数组来一次性获得多个数组元素。
- 利用花哨的索引,结果的形状与索引数组的形状一致,而不是与被索引数组的形状一致。
- 对多个维度适用
- 索引值的配对遵循广播的规则,故们将一个列向 量和一个行向量组合在一个索引中时,会得到一个二维的结果。
- 花哨的索引返回的值反映的是广播后的索引数组的形状,而不是被索引的数组的形状。
组合索引
- 花哨索引和简单索引
- 花哨索引和切片
- 花哨索引和掩码
mask = np.array([1,0,1,0],dtype=bool) x[row[:,np.newaxis],mask]
花哨索引示例:选择随机数
- 从多元正态分布中抽取随机样本
- 利用得到的索引值选取到原始数组对应的值
数组的排序
选择排序
def selection_sort(x): for i in range(len(x)): swap = i + np.argmin(x[i:]) (x[i],x[swap]) = (x[swap],x[i]) return x #np.argmin(x)返回数组x中最小值的索引 #np.argmax(x)返回数组x中最大值索引
bogosort排序算法
def bogosort(x): while np.any(x[:-1] > x[1:]): np.random.shuffle(x) return x # np.any(x[:-1] > x[1:])表示存在任何x[i] > x[j],其中i
np中的快速排序
- np.sort:默认为快排。在不修改原始输入数组的基础上返回一个排好序的数组。(在原始数组上修改可用py内置的sort方法)
- np.argsort(x):返回原始数组排好序的索引,可被用于通过花哨的索引创建有序的数组
部分排序:分隔
- np.partition(x,k,axis=n) 分隔为左边k个是数组中最小的k个值,右边是原始数组剩下的值。在两个分隔区间中,元素都是任意排列的。 可通过参数axis可沿着多维数组任意的轴进行分隔
- np.argpartition 返回索引值
结构化数据
- 生成结构化数组
#生成数组 x = np.zeros(4,dtype={'names':(),'formats':()}) #采用字典方法 np.dtype({'names':[],'formats':[]}) #元组列表 np.dtype([('name','U10'),('age','i4')]) #可省略类型名(自动指定为f+索引) np.dtype('U10,i4,f8')
- 记录数组 np.recarray