- Numpy安装
在cmd中使用pip install numpy
进行安装
- Numpy简介
Numpy(Numerical Python)是目前Python数值计算中最为重要的基础包。大多数计算包都提供了基于Numpy的科学函数功能,将Numpy的数组对象作为数据交换的通用语。
特点:
• 提供高效多维数组
• 提供了基于数组的便捷算术操作以及广播机制
• 对数据进行快速的矩阵计算
• 对硬盘中数组数据进行读写操作
- Numpy基本操作
需要:import numpy as np
基本方法 | |
---|---|
np.array(object,dtype = None) | 将输入数据转换为ndarray数组,自动推断数据类型,默认复制所有输入数据 |
np.asarray(object,dtype = None) | 将输入数据转换为ndarray数组,但输入数据已经是ndarray则不再复制 |
np.arange(start,end,step) | 生成一个数组 |
arr.astype(dtype) | 修改数组类型 |
np.zeros(shape) | 根据给定形状和数据类型生成全0数组 |
np.ones(shape) | 根据给定形状和数据类型生成全1数组 |
np.empty(shape) | 根据给定形状和数据类型生成一个没有初始化数值的空数组 |
np.full(shape,num) | 根据给定形状和数据类型生成一个没有初始化数值的空数组 |
np.where(condition,[x,y]) | 筛选出数组中满足条件的元素,对其进行修改,如果满足condition修改为x,不满足condition修改为y(如果只有conditon 则返回满足元素的行和列) |
arr.clip(min,max) | 将小于min的改为min,将大于max的改为max |
np.count_nonzero() | 计算非零的个数 |
np.sign(arr) | 将数组中的值标签化,大于0的变成1,小于0的变成-1 |
np.sort(arr,axis) | 排序,默认为最后一个轴排序,axis:指定轴 |
np.linspace(start,stop,num) | 将制定区间等分为多少份 |
np.unique(data,return_counts) | 返回并不重复arr中所有的元素,在指定return_counts = True 返回不重复元素出现的次数 |
数组属性 | |
---|---|
arr.ndim | 查看数组的维度,返回值为整数 |
arr.shape | 查看数组每个维度的值,返回值为元组 |
- 数组的数据类型
(一个数组中只存在一种数据类型)
类型 | 类型代码 | 描述 |
---|---|---|
int8,uint8 | i1,u1 | 有符号和无符号的8数位整数 |
int16,uint16 | i2,u2 | 有符号和无符号的16数位整数 |
int32,uint32 | i4,u4 | 有符号和无符号的32数位整数 |
int64,uint64 | i8,u8 | 有符号和无符号的64数位整数 |
float16 | f2 | 半精度浮点数 |
float32 | f4 | 标准单精度浮点数 |
float64 | f8 | 标准双精度浮点数 |
bool | ? | 布尔值,存储True或False |
string_ | S | ASCII字符串类型,eg:‘S10’ |
unicode_ | U | Unicode类型,eg:‘U10’ |
- 数组的维度
(数组的维度,可理解为套娃,一层套一层,取出从外往里取)
一维
二维
三维
- 重塑数组
方法 | |
---|---|
arr.reshape(shape,order = “C”) | 将一维数组转多维,shape:元组(所有数乘积必须与所有元素数量相等),order:1.“C” 顺序 2.“F” 逆序 |
arr.flatten() | 将多维数组转一维 |
arr.ravel() | 将多维数组转一维 |
arr.transpose() | (转置)行列转换 |
arr.T | (转置)行列转换 |
arr.swapaxes() | (换轴)(相当于行列转换)(0代表行,1代表列) |
- 数组的拷贝
不拷贝 (指向,引用)(相当于c语言指针)
import numpy as np
arr = np.arange(10)
arr_2 = arr
浅拷贝 (复制表层,引用深层)
import numpy as np
arr = np.arange(10)
arr3 = arr.view()
print(arr3 is arr)
arr3[0] = 10
print(arr)
深拷贝 (复制全部)
import numpy as np
arr = np.arange(10)
arr3 = arr.copy()
print(arr3 is arr)
arr3[0] = 10
print(arr)
- Numpy数组算数
数组之所以重要是因为它允许我们进行批量操作数据并且没有任何for循环。也被称为向量化。
数组与标量的算术操作
数组与标量的算术操作会把计算参数传递给数组的每一个元素。
import numpy as np
arr = np.arange(6).reshape(2,3)
arr+1
两个等尺寸数组的算术操作
两个等尺寸数组的算术操作实际上是逐元素操作。
arr = np.arange(1,7).reshape(2,3)
arr
arr+arr
arr/arr
arr-arr
广播机制
广播机制规则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
与列数相同并且只有1行的数组之间进行运算 (将自动补齐所有行)
与行数相同并且只有1列的数组之间进行运算(将自动补齐所有列)
注意:(维度完全不一致,则无法广播。)
- 数组的拼接
方法 | |
---|---|
np.vstack(arr1,arr2) | 垂直拼接 |
np.hstack(arr1,arr2) | 水平拼接 |
(水平拼接需要对应行数一致,垂直拼接需要对应列数一致。)
切片
神奇索引:元组构成,元组中的每个元素代表一个索引
语法:(索引,索引,索引…)
布尔索引:表达式构成,其中逻辑运算符用 & 与 | 代替 and 与 or , 取出满足表达式的值,组成一维的ndarray
语法:[arr_name 运算符 num]
索引:按索引范围取元素,也可在间隔取元素(左闭右开原则)
语法:[ start : end : step ]
(取值和列表类似,维度之间相乘即可,可参考Python列表切片及方法)
关于维度问题:维度不同,只是索引多少问题,并不以影响切片
(不同点只在于修改数组时,修改数组时并不会改变数组的行列数,只会改变数组的所取的元素值,遵循 多对一,shape对应 原则即可)
当只取多行单个元素:
(当赋值多个元素时,要求元素个数相同)
import numpy as np
arr = np.arange(10).reshape(2,5)
#one
arr[:,1] = 2,2
#two
arr[:,1] = 2
one的值:[[0 2 2 3 4] [5 2 7 8 9]]
two的值:[[0 2 2 3 4] [5 2 7 8 9]]
当取多行多个元素时:
(赋值多个元素时,要求shape相同)
import numpy as np
arr = np.arange(10).reshape(2,5)
arr2 = np.arange(4).reshape(2,2)
#one
arr[:,1:3] = arr2
#two
arr[:,1:3] = 1
one的值:[[0 0 1 3 4] [5 2 3 8 9]]
two的值:[[0 1 1 3 4] [5 1 1 8 9]]
当取单行多个元素时:
(赋值多个时,只需要元素个数与赋值个数对应即可)
import numpy as np
arr = np.arange(10)
#one
arr[1:4] = 3,2,1
#two
arr[1:4] = 1
one的值:[0 3 2 1 4 5 6 7 8 9]
two的值:[0 1 1 1 4 5 6 7 8 9]
当取单行多个元素时:
(取单个元素不允许赋多个值)
import numpy as np
arr = np.arange(10)
#one
arr[1] = 3
one的值:[0 3 2 3 4 5 6 7 8 9]
(主要原理自己体会,没时间解释,快上车~)
- 文件读写操作
写入本地数据:
通过:
savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)
np.savetxt()(属性) | |
---|---|
fname | 文件名及路径 |
X | 需要写入的文件数据 |
fmt | 写入数据的格式 |
delimiter | 分隔符 |
newline | 每行数据写入之后,默认为换行 |
header | 表头 |
footer | 表尾 |
comments | 将其标记为注释,默认在开头加一个#号 |
encoding | 编码 |
读取本地数据:
通过:
loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None)
np.loadtxt()(属性) | |
---|---|
fname | 文件名及路径 |
dtype | 指定类型 |
comments | 默认为注释,在最前面加上#号 |
delimiter | 分隔符 |
converters | 对数据预处理。比如{0:func}第0列进行func函数预处理 |
skiprows | 跳行读取,指定从第几行开始读取 |
usecols | 指定取出的列 |
unpack | 对数据进行打包 |
ndmin | 指定维度 |
encoding | 编码 |
max_rows | 读取skiprows之后的最大行数 |
- NaN与inf
nan: not a number 表示不是一个数字,属于浮点类。
inf: np.inf 表示正无穷,-np.inf表示负无穷,属于浮点类。
nan 特点:
- 两个nan是不相等的
- np.isnan() 判断数组元素是否是NaN,返回为bool值
- np.nan与任何数值计算都是nan
- numpy中的random模块函数
导入numpy模块之后,直接通过np.random.函数名,即可调用函数
函数 | |
---|---|
randint(min,max,size = shape) | 生成shape形状数组 ,内容随机 |
seed(num) | 指定随机数生成时所用算法开始的整数值 |
choice(data,size = shape) | 生成shape形状数组,内容随机为data里的数 |
shuffle(arr) | 将arr中所有元素顺序打乱 |
rand() | 生存shape形状数组,内容随机为[0,1)之间的数 |
randn() | 生成shape形状数组,内如随机为均值(μ)为0,标准差(σ)为1的标准正态分布的值 |
- 常用函数
聚合函数
聚合函数相比python内置函数,更加高效迅速且快捷
方法 | |
---|---|
arr.mean(axis,detype) | 求平均值,axis:指定轴,detype:指定类型 |
np.sum(arr,axis) | 求和,axis:指定轴 |
np.min(arr,axis) | 求最小值,axis:指定轴 |
np.max(arr,axis) | 求最大值,axis:指定轴 |
np.argmin(arr,axis) | 求最小值索引,axis:指定轴 |
np.argmin(arr,axis) | 求最大值索引,axis:指定轴 |
np.var(arr) | 求方差,样本数据 跟 均值之间的偏离程度 |
np.std(arr) | 求标准差,标准差是方差的算符平方根(有正负),(反应数据的波动性) |
np.ptp(arr,axis) | 求极值,axis:指定轴 |
np.median(arr,axis) | 求中值,axis:指定轴 |
np.cumsum(arr,axis) | 累计和(求出数组每前n个数相加的和,从0开始累积),axis:指定轴 |
(算数运算,出现nan,有对应的nan方法,大部分在方法前加上nan即可)
一元函数
(只有一个参数)
方法 | |
---|---|
np.abs | 绝对值 |
np.sqrt | 开平方 |
np.square(arr) | 平方 |
np.exp | e的次方 |
np.np.log,np.log10,np.log2,np.log1p | 求以e为底,以10为低,以2为低,以(1+x)为底的对数 |
np.ceil | 向上取整,比如5.1会变成6,-6.9会变成-6 |
np.floor | 向下取整,比如5.9会变成5,-6.1会变成-7 |
np.rint,np.round | 四舍六入五双飞 |
np.modf | 将整数和小数分隔开来形成两个数组 |
np.isnan | 判断是否是nan |
np.isinf | 判断是否是inf |
np.cos,np.cosh,np.sin,np.sinh,np.tan,np.tanh | 三角函数 |
二元函数
(只有两个参数)
函数 | |
---|---|
np.add | 加法运算(即1+1=2),相当于+ |
np.subtract | 减法运算(即3-2=1),相当于- |
np.negative | 负数运算(即-2),相当于加个负号 |
np.multiply | 乘法运算(即23=6),相当于 |
np.divide | 除法运算(即3/2=1.5),相当于/ |
np.floor_divide | 取整运算,相当于// |
np.mod | 取余运算,相当于% |
greater,greater_equal,less,less_equal,equal,not_equal | >,>=,<,<=,=,!=的函数表达式 |
logical_and | & 的函数表达式 |
logical_or | | 的函数表达式 |
布尔函数
函数 | |
---|---|
np.any() | 只要有一个元素为True,返回值就为True |
np.all() | 只要有一个元素为False,返回值就位False,否则为True |