数组:是同一类型的数据组成的一个队列。
2. Numpy介绍
是Python进行数据科学计算的基础软件包,核心是ndarray对象
- 功能强大的N维数组对象
- 精密广播功能函数
- 集成C/C++ 和Fortran 代码的工具
- 强大的线性代数、傅里叶变换和随机数功能
- 结合稀疏矩阵框架scipy 更加高效实现矩阵运算
a . {a.} a. 使用pip安装: ⟶ {\longrightarrow} ⟶ pip install numpy
{}
b . {b.} b. 在Anonconda使用conda安装: ⟶ {\longrightarrow} ⟶ conda install numpy
import numpy as np
import 导入 numpy 包名 as np 当前模块中的引用名称或者别名
a {a} a 查看版本
np.version
查看版本的作用是因为我们在实际工作中不同的项目可能引用不同版本的版本,各个版本之间的差异性可能会导致一些我们未预料的问题。为了项目的一致性,搭建环境会用到。
建议相关操作在jupyter notebook 下进行方便操作和验证
# ndarray对象的创建 静态构造
# 一维数组
arr = np.array([1, 2, 3])
type(arr)
# 二维数组
arr1 = np.array([[1, 2, 3],[2, 3, 4]])
# 常规函数的创建
# 创建一维数组
np.ones(3) # 结果为: [1. 1. 1.]
# ones() 函数定义 参数列表如下
# shape: Union[int, Iterable[int]],
# dtype: Optional[object] = None,
# order: Optional[str] = 'C'
np.ones((5,), dtype=int)# 结果为 [1 1 1 1 1]
# 等差数列
# 从1到5 取五个数
np.linspaces(1,5,5)
# 输出结果为:[1. 2. 3. 4. 5.]
linspaces 参数详解
linspace(start: Union[ndarray, Iterable, int, float], --> 开始位置
stop: Union[ndarray, Iterable, int, float], --> 结束位置
num: Optional[int] = 50, --> 取几个数
endpoint: Optional[bool] = True,–> 是否包含结束位置的值,决定了是左闭右开[,)还是左闭右闭[]
retstep: Optional[bool] = False, --> 是否显示步长
dtype: Optional[object] = None, --> 元素数据类型
axis: Optional[int] = 0 --> 轴的坐标,默认为0)
# 演示demo
# 修改参数时,形参名称=值 形式,按照顺序时候可省略形参名
np.linspace(1, 5, 5,retstep=True)
# 结果为:(array([1., 2., 3., 4., 5.]), 1.0)
# 等比数列
np.logspace(1,2,2)
# 结果为:[ 10. 100.]
logspace() 参数详解
logspace(start: Union[ndarray, Iterable, int, float], --> 以base值为底,以当前值为指数的值,默认base为10 就等于 1 0 1 10^1 101作为起始值 . l o g 10 1 0 1 log_{10}^{10^1} log10101 = 1,
stop: Union[ndarray, Iterable, int, float],–> 以base值为底,以当前值为指数的值,默认base为10,当值为2的 就等于 1 0 2 10^2 102=100. (默认值得格式为float64)作为截止值,最后一个元素
num: Optional[int] = 50, --> 取多少个数,np.logsapces(1,2,4),当num=4 的时候,我们看下结果
endpoint: Optional[bool] = True, --> 是否包含以结束位置为指数的值
base: Optional[float] = 10.0, --> 是否包含结束位置的值
dtype: object = None,
axis: Optional[int] = 0)
np.logspace(1, 2, 4)
# [ 10. 21.5443469 46.41588834 100. ]
# 默认规则为[1,2],包含首位之后,还需要两个数才能满足四个值得要求,剩下两个的指数就是4/3,5/3
# 10^(4/3)约等于21.5443469
np.logspace(1, 2, 4,base=2)
# 结果为;[2. 2.5198421 3.1748021 4. ]
arr = np.array([1, 2, 3.9, 4.5])
# arr数据类型转换为整形int ,dtype=data type 的简写 查看元素的数据类型
# type 函数:查看整个对象的类型
arr.dtype = np.int64
arr
int 和float底层存储时存储方式不一致
使用astype可以实现强制类型转换,其本质时copy 原数组,可查看对应的方法参数
改变形状
# 改变形状
# 手动构建
np.array([[1, 2, 3, 4],[5,6, 7,8],[9, 10, 11]])
# 自动构建
arr = np.arange(12)
arr.reshape((3 ,4))
基本操作
arr = np.array([1, 2, 3, 4])
# 索引
# index遍历检索 index默认取一个
arr[1]
arr[[1, 0, 2]]
# 布尔数组获取(True/False)
arr[[True,False]]
arr > 3 # 默认循环
arr[arr>3]
# 切片 start:stop:step
arr[:]
arr[:2]
arr[::-1]
arr[:-3:-2] # 先看step,负数表示倒序(默认起始位-1),2增量,上述例子为[3, 4]
# 多维
arr = np.arange(12).reshape(3, 4)
arr[1][1]
arr[1, 1]
arr[:2, 1:3] # 从左到右,多维从外到内
# 矢量化运算
# 标量
l1 = [1, 2, 3]
arr = np.array(l1)
arr ** 2
# 矢量运算
l1 = [1, 2, 3]
l2 = [4, 5, 6]
arr1 = np.array[l1]
arr1 = np.array[l2]
arr1 + arr2
# 广播
# 一维数组和多维数组操作时的处理
轴
arr = np.arange(12).reshape((3,4))
arr.max()
# axis :轴 0:垂直方向——列 1:水平方向——行
arr.max(axis=1)
arr.max(axis=0)
# 扁平化 将多维数组转换为一维数组
arr = np.arange(12).reshape(3,4)
# ravel() 多维变一维 返回时视图
arr.ravel()
# flatten() 返回是copy
arr.flatten()
函数
#1.随机数
# 1.1 取随机数[0, 1)
np.random.random(5)
# 1.2 随机种子 seed
np.random.seed(10)
np.random.random(5)
# 1.2.整数
# start: step: shape
np.random.randint(1,100,(3, 4))
# 1.3正态分布
# 均值,标准差 ,size 数值个数
np.random.normal(178, 2, 10)
# 2. 算术运算
np.abs(-10)
np.ceil(12.3) # 向上取整
np.floor(12.3) # 向下取整
np.exp() # 以自然数e为底的指数函数
np.log() # default 底数为10
np.log2() # 底数为2
np.modf(3.5) # 将小数分为整数部分和小数部分
# sin() cos() 等三角函数
np.sin(x) # x 为弧度值 弧度= 角度* π ÷ 0
np.sqrt(25) # 求开方值
# 3 统计函数
# Numpy(或数组对象)具有如下常用的统计函数
nd = np.array([1, 2, 3])
np.mean(nd) # 求平均值,可用axis制定方向
np.sum(nd) # 求和
np.max(nd)
np.min(nd)
np.argmax(nd) # 最大值的索引
nd.argmax()
np.argmin(nd)
np.cumsum(nd) # 累加,是将传入数组进行对应方向的项累加
np.cumprod(nd) #阶乘
# 以上方法都可以指定轴方向
nd1 = np.arange(10).reshape(3, 4)
nd2 = np.arange(10).reshape(3, 4)
print(nd1)
print(nd2)
# 连接
np.concatenate((nd1, nd2),axis=0)
np.vstack((nd1, nd2))# 垂直方向,即列方向
np.hstack((nd1, nd2)) # 水平方向
# 切分
# 1 等分 方向 默认为列方向 axis=0
np.split(nd1,2)
#2 不等分
np.split(nd1, [1,3],axis = 0)
# 0-1 1-3 3-
说明可以指定排序的轴
save 在保存数组时,如果没有指定扩展名,则自定补充.npy作为扩展名
# any() 只要有一个是TRUE则为TRUE
nd1 = np.arange(10)
nd1.any()
# all() 只要有一个false就为false
nd1 = np.arange(12).reshape(3, 4)
nd1.T # 转置
np.transpose(nd1)
# 交换,(数组,axis,axis)
np.swapaxes(nd1, 1, 0)
# 点积运算 @ dot() 行列式运算
a = np.arange(12)
np.uniue(a) # 去重
# where 类似于三元运算符
np.where(1>2, 1, 2)
np.save("lujing",a) # 保存数据
np.load() # 加载数据