python库基础--numpy
numpy基础
python的基于数组的计算工具库,其本身并不包含建模和科学函数,其主要目的是提供更加快和方便的运算,其他的很多包也是根据这个包来编写的,numpy比python自身方法快10-100倍
numpy导入
通常导入numpy为np
多维数组对象
numpy中的核心之一,N维数组对象 ndarray,一种容器行数据类型
对该对象的数据操作将会应用到其中的每个元素上面
对于ndarray来说,其为多维同类数据容器,即其每个元素为相同类型
data = np.random.randn(2,3) 两行三列 二维
属性:
1.data.shape //返还一个元组 (2,3) 其中表示了数组中每一个维度的数量
2.data.dtype //返还数据 dtype('float64') 返还了容器内数据的类型
3.data.ndim //返还一个整数 为维度
多维数组对象的产生
如何生成一个ndarray类型对象
1.np.array() //传入序列型对象,生成一个ndarray的对象
2.np.zeros() //传入单个整数,生成一维全为0的ndarray,传入元组,生成元组个数维度的全为0的ndarray
3.np.empty() //用法同上,但是不是全0 全空,元素是系统内默认的垃圾数据
4.np.arange() //python的range()函数的数组版,仅能传入一个整数
5.np.full() //根据给定形状和数据类型生成数组 如: np.full((3,3,3),4)
6.np.xx_like() //传入一个ndarray,生成一个形状相似的元素为xx的ndarray
ndarray的数据类型
类型不用担心,反正一般也不会搞错
类型转换: .astype()
array1 = array1.astype(np.int32)
在numpy中可以简单的使用float,int 来表示和python中相同精度的数据类型
数组运算
规则:
每个位置元素分别进行运算
对于两个数组 会 对两个数组每个元素相对应的运算
对于数组和标量,会将参数传递给数组中每一个元素
对于比较,每个位置对应比较,返回一个bool类型的ndarray
对于不同尺寸的数组,会运用广播特性
数组基本切片和索引
1.一维数组
array1[0] //类python
array1[0:3] //顾头不顾尾
array1[0:3] = 12 //将12 赋值给 array1[0],array[1],array[2]的位置
//和python区别是 该数组的切片并非是复制,而是数组本身的展示,所以,对切片的改变会影响到原数组
//解决方法: array1[0:3].copy()
array1[:] //会得到全部的值
2.二维数组
二维数组单个索引不是一个值,而是一个一维数组
在二维数组的索引上,我们可以将0轴看为行,将1轴看为1列
array1[0][2]
或者,效果一样
array1[0,2]
切片:
array1[0:2] //将0轴看为一个整体,取前两行
array[:2,1:]
可以将索引和切片混合,得到低纬度切片
array[1,:2]
3.多维数组
每次单个索引,相当于降低一个维度
但是需要注意,每次切片依旧是视图
布尔索引
比较符 == 也可以向量化
可以利用布尔值数组来进行索引
如:
若names = np.array(['cc','jj','gg'])
data = np.random.randn(3,5)
data[names == 'cc']
可以得到cc对应的一行
原理: 将names转换为一个bool值数组,bool为Ture的可以得到一行数据,
除了== 还有 & | ~
限制:
布尔值数组的长度必须和数组索引轴长度一致,但当长度不对时,并不会报错,所以 要小心
python中的 and or not 对数组无效,记住&|~
还可以 data[data < 0] = 0 来对整个数组中每个元素进行索引操作
神奇索引
numpy中的术语
可以使用整数数组来进行数据索引
[2,3,4]
可以得到含有2,3,4行的一个ndarray
[-2,-3,-4]
也可以为负,意味从后面开始索引
传入多个数组,会得到一个整数数组
[2,3,4],[2,1,0]
2,2 3,1 4,0 会得到这三个值对应的一个一维数组
ps : .reshape() 传入元组,将数组转化为元组规定的形状, 但是并不是其本身改变
数组转置和换轴
转置: 一种特殊的数据重组形式,numpy中含有不进行复制任何内容的视图转置
data.T //输出数组的转置形式
data.transpose() 传入一个元组,元组内放入轴的新排序,可以画图看一下
通用函数 也可以称为ufunc
np.sqrt(ndarray) 对每个元素进行开方
np.exp(ndarray) 将每个元素带入e^x中
np.maximum(x,y) 取xy中大的元素
remainder_part ,whole_part = np.modf(x) 返回小数部分和整数部分
详细见:



面向数组编程
利用numpy进行运算可以使利用纯python快一到二个数量级,而利用数组表达式来代替显示循环的方法,被称为:向量化
x,y = np.meshgrid(*xi, **kwargs), 接收两个一维数组,生成一个二维数组
point_x = np.arange(-5,5,1)
point_y = np.arange(-5,5,1)
x,y = np.meshgrid(point_x,point_y) //点的个数分别为x,y轴上的个数,其值分别为(x,y)
z = np.sqrt(x**2 + y**2) //z为距离中心0的距离
数学和统计方法
arr.mean() 或者 np.mean(arr)//求均值
arr.sum() //求和
这些函数都有一个可选参数 axis
arr.mean(axis=n) 计算n轴上的平均值
可以形成一个下降一个维度的数组
arr.min() 最小值
arr.max() 最大值
arr.argmax() 最大值位置
arr.argmin() 最小值位置
arr.std() 标准差
arr.var() 方差
arr.cumsum() 进行累加,当其按轴进行累加时,并不会发生聚合
arr.cumprod() 累乘
布尔值数组方法
在运用前面的方法对布尔值进行计算式,布尔值会强行被转换为1或者0,因此sum() 函数可以计算布尔值数组的True或者False个数
对于布尔值数组的两个很有用的方法
bools.any() //检测时候会有至少一个为True,返回一个布尔值
bools.all() //检测数组中是否全部为True,返回一个布尔值
排序
arr.sort() //由小到大进行排序
可选参数 axis,可以按轴进行排序,返回方法为copy而不是对原数组进行排序
唯一值
np.unique(names) //返回一个仅有唯一的数组,合并同类并排序后返回
np.in2d(tested,array1) 可以检测一个数组的值是否在另一个数组中,返还一个bool数组
线性代数方法
x.dot(y) 或者 np.dot(x,y) // 矩阵乘法
numpy.linalg 拥有完整的矩阵分解的标准函数集,如求逆和行列式求解
伪随机数
np.random.normal(size = ())
得到一个size形状的正太分布样本
np.random.seed(1234) //更改种子
np.random.permutation(data) //返回一个序列的随机排序 打乱
np.random.rand(n) //在均匀分布中抽取样本
np.random.randint(low, high=None, size=None, dtype=None) //根据给定的范围随机抽取整数
np.random.randn(n) //由均值0,方差1的正态分布抽取样本
np.random.uniform //由(0,1)见的均匀分布抽取样本

浙公网安备 33010602011771号