python学习——numpy库的使用[超详细的学习笔记]
numpy是Python语言的一个扩展包 ,是 “ Numeric Python”的简称,它是一个由多维数组对象和用于处理数组的例程集合组成的库。numpy 是Python数值计算中最重要的基础包,支持N维数组运算、处理大型矩阵、成熟的广播函数库、矢量运算、线性代数、傅里叶变换、随机数生成,也为数组运算提供大量的数学函数库。
目录
2.2.6 np.zeros_like() 和**数组的shape一样,全零的数组
2.2.7 np.ones_like() 和**数组的shape一样,全一的数组
2.2.8 np.full() 返回给定形状和类型的新数组,填充fill_value
2.2.9 np.identity(),np.eye() 单位矩阵形成的数组
5.9 np.vstack() 垂直堆叠数组,和np.concatenate((...),axis=0)一样
5.10 np.hstack() 水平堆叠数组,和np.concatenate((...),axis=1)一样
5.12 np.vsplit(),和np.split(axis = 0)一样
5.13 np.hsplit(),和np.split(axis = 1)一样
前言
numpy是Python语言的一个扩展包 ,是 “ Numeric Python”的简称,它是一个由多维数组对象和用于处理数组的例程集合组成的库。
numpy 是Python数值计算中最重要的基础包,支持N维数组运算、处理大型矩阵、成熟的广播函数库、矢量运算、线性代数、傅里叶变换、随机数生成,也为数组运算提供大量的数学函数库。
与python原生array区别:
- NumPy 数组在创建时有固定的大小,更改ndarray的大小将创建一个新的数组并删除原始数据,不同于Python列表(可以动态增长)。
- NumPy 数组中的元素都需要具有相同的数据类型。
- 数组的元素如果也是数组(可以是 Python 的原生 array,也可以是 ndarray)的情况下,则构成了多维数组。
- NumPy 数组操作比使用Python的内置序列可能更有效和更少的代码执行。
1 导入及查看版本信息
import numpy as np #导入numpy并简写为np
print(np.__version__)#查看版本
2 数组的创建
numpy中定义的最重要的对象是称为ndarray的N维数组类型。ndarray中的每个元素在内存中使用相同大小的块,它描述相同类型的元素集合。
a=np.array([1,2,3,4])#把列表转换为数组
type(a)#类型
#out: numpy.ndarray
2.1 基础数据类型转换为数组
np.array([1,2,3,4])#列表转换为数组
np.array((1,2,3,4))#把元组转换为数组
np.array(range(5))#range对象转换成数组
#out:array([1, 2, 3, 4])
# 数组转为列表
a = np.array([1,2,3,4])
a.tolist()
#out:[1, 2, 3, 4]
2.2 数组内置方法
2.2.1 np.arange() 线性序列数组
用来创建一个线性序列的数组,在给定间隔内返回均匀间隔的值。
arange([start,] stop[, step,], dtype=None)
np.arange(0,10,2) #开始,结束,步长,左闭右开
#out:array([0, 2, 4, 6, 8])
2.2.2 np.linspace() 等差数组
np.linspace(start, stop, num=50, endpoint=True)
在指定的间隔内返回均匀间隔的数字,用作相同间隔采样。
start:标量,序列的起始值。
stop:标量,除非"endpoint"设置为False,否则为序列的结束值。
num:int,可选。要生成的样本数。默认值为50.必须为非负数。
2.2.3 np.logspace() 等比数组
2.2.4 np.zeros() 全零的数组
2.2.5 np.ons() 全一的数组 float型
2.2.6 np.zeros_like() 和**数组的shape一样,全零的数组
2.2.7 np.ones_like() 和**数组的shape一样,全一的数组
2.2.8 np.full() 返回给定形状和类型的新数组,填充fill_value
np.full(shape,fill_value,dtype = None)
shape:int或int的序列新数组的形状,例如(2,3) 或2 。
fill_value:标量填充值。
dtype:数据类型,可选数组所需的数据类型默认值为"None"。
2.2.9 np.identity(),np.eye() 单位矩阵形成的数组
返回一个二维数组,其中对角线为1,其余为零的二维数组。
2.2.10 np.diag() 对角数组
2.2.11 np.empty() 空数组,元素取值随机
2.2.12 np.random 生成随机数组
- np.random.randint() 随机整数,左闭右开
语法:randint(low, high=None, size=None, dtype)
- np.random.rand() ,np.random.random() 0到1之间随机浮点数
语法:np.random.rand(size=None) / np.random.random(size=None)
返回随机浮点数,在半开区间[0.0,1.0)中
- np.random.uniform() 指定区间之间随机浮点数
语法:np.random.uniform(low=0.0, high=1.0, size=None)
返回随机浮点数,在半开区间[a,b)中。
- np.random.seed() 随机数种子
np.random.seed(Num)可以设置一组种子值,确保每次程序执行的时候都可以生成同样的随机数组。
- np.random.randn(),np.random.standard_normal() 标准正态分布
均值为0,标准差为1的标准正态分布
- np.random.normal() 正态分布
语法:normal(平均值,标准偏差,形状)
作用:从正态分布中抽取随机样本。
如果平均值为0,标准差为1,或者不写这两个参数,就等同于标准正态分布np.random.randn()
- np.random.shuffle() 混洗其内容来就地修改序列,没有返回值
3 数组属性
属性 | 说明 |
ndim | 返回int,表示数组的维数 |
shape | 返回tuple,表示数组的尺寸 |
size | 返回int,表示数组的总元素 |
dtype | 返回data-type,描述数组中元素类型 |
itemsize | 返回int,表示数组每个元素的大小(字节为单位) |
基于以下两个数组,查看各个属性的使用方法:
3.1 ndim 查看维度
3.2 shape查看尺寸
- 如果是一维的数组,返回一个元素所构成的元组。
- 如果是二维的数组,返回(行数,列数)的元组。 例如:(2, 4)该二维数组是二行四列,(该二维数组有2个一维数组组成,每个一维数组里 有4个元素)
3.3 size 查看总元素
维度数的乘积
3.4 itemsize 查看数组每个元素大小
3.5 dtype 查看数组中元素类型
NumPy 要求数组必须包含同一类型的数据。
a.dtype #元素类型
#out: dtype('int32')
b.dtype
#out: dtype('int32')
3.5.1 数据类型分类
3.5.2 数组数据类型的转换
- 如果类型不匹配,NumPy 将会向上转换: 字符串>浮点数>整数 查看类型
- ndarray.astype("数据类型名") 或者 ndarray.astype(np.数据类型名)
b=np.array([1,2.1,3,4])
b.dtype #numpy存储数据一样,以位宽最大为准,自动向上转换
#out: dtype('float64')
3.5.3 缺失值:特殊的浮点型
只能用np.isnan() 来判断是否是空值
空值任何运算的结果均为空值
4 索引和切片
4.1 一维数组的索引
从0开始的,并且接受负索引来从数组的结尾进行索引。
4.2 多维数组
每一个逗号, 代表索引的一个维度
可以使用切片和步长来截取不同长度的数组 x[start:stop:step]
5 数组的变形、拼接和分裂
变形 | 展平 | 转置 | 拼接 | 分裂 | |
原地修改 | shape() resize() | ||||
新生成 | reshape() | flatten() ravel() | swapaxes() T | concatenate() vstack() hstack() | split() vsplit() hsplit() |
1. 一维数组 如果有一个操作需要设置轴,一维数组只有一个轴,也就是轴0
axis=0 基本操作单位就是一维数组里的一个个元素
2. 二维数组 如果有一个操作需要设置轴,二维数组有两个轴,轴0和轴1
axis=0 基本操作单位是二维数组里的一个个一维数组
axis=1 基本操作单位是一维数组里的一个个元素
3. 三维数组 如果有一个操作需要设置轴,三维数组有三个轴,轴0、轴1和轴2
axis=0 基本操作单位是三维数组里的一个个二维数组
axis=1 基本操作单位是二维数组里的一个个一维数组
axis=2 基本操作单位就是一维数组里的一个个元素
5.1 reshape() 变换数组的形态,新生成
使用ndarray.reshape()变形不会改变原有的数组形状,而是生成一个新的对象
在使用 reshape 时,可以将其中的一个维度指定为 -1,Numpy 会自动计算出它的真实值
5.2 resize() 变换数组的形态,原地修改
5.3 shape() 变换数组的形态,原地修改
5.4 flatten() 展平,降维
5.5 ravel() 展平,降维
数组的平铺,不管多少维,全部铺开变成一维
5.6 swapaxes() 转置
5.7 T 转置
5.8 np.concatenate() 拼接
concatenate((a1, a2, ...), axis=0, out=None) 沿现有轴加入一系列数组。
a1,a2,...:array_like的序列。除尺寸外,阵列必须具有相同的形状
axis:int,可选。数组将连接的轴。如果axis为None,数组在使用前是扁平的。默认值为0。
5.9 np.vstack() 垂直堆叠数组,和np.concatenate((...),axis=0)一样
5.10 np.hstack() 水平堆叠数组,和np.concatenate((...),axis=1)一样
5.11 np.split() 分裂
语法:np.split(ary,indices_or_sections,axis = 0)
作用:将数组拆分为多个子数组。
- ary:ndarray。
- indices_or_sections:int或1-D数组。
- 如果indices_or_sections是一个整数N,则数组将被分割沿着'轴'进入N个相等的数组。
- 如果indices_or_sections是排序整数的1-D数组,则为条目指示数组被分割的“轴”的位置。
- 如果索引超过沿“轴”的数组维度,相应地返回一个空的子数组。
axis:int,可选。要拆分的轴,默认为0。
5.12 np.vsplit(),和np.split(axis = 0)一样
语法:np.vsplit(ary,indices_or_sections)
作用:将数组垂直拆分为多个子数组(按行)。
'vsplit'相当于'split'用'axis = 0'来'拆分',数组总是沿着第一个轴分开,无论数组尺寸如何。
5.13 np.hsplit(),和np.split(axis = 1)一样
语法:np.hsplit(ary,indices_or_sections)
作用:将数组水平拆分为多个子数组(按列)。
'hsplit'相当于'split'用'axis = 1'来'拆分',数组总是沿着第二个分开,轴与阵列尺寸无关。
6 数组的运算
6.1 数组与数值的运算
数组与数值运算相当于每个元素都进行此运算
6.2 数组与数组的运算
6.2.1 基本运算函数
6.2.2 判断符
6.2.3 聚合函数
6.2.4 唯一化和集合逻辑
常用来 去重
交集
x数组元素是否包含y的布尔型数组
并集
差集
补集
6.3 数组的广播机制
广播机制:当我们使用通用函数对两个数组进行计算时,通用函数会对这两个数组的对应元素进行计算,因此它要求这两个数组shape相同。
如果shape不同的话,会进行如下的广播(broadcasting)处理:
- 让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐
- 输出数组的shape是输入数组shape的各个轴上的最大值
- 如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错
- 当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值
6.4 矩阵操作
矩阵和数组的关系:矩阵是数组的子类(也有广播机制)
6.4.1 矩阵创建
6.4.2 矩阵的转置与逆矩阵
6.4.3 矩阵的+-*/符合矩阵计算规则
6.4.4 矩阵的拼接
7 numpy数据的保存和读取
7.1 一个数组情况
7.1.1 np.save() 保存
arr1 = np.arange(10).reshape(2,5) #创建一个数组
np.save('arr1.npy',arr1)#保存的是单个数组
7.1.2 np.load() 读取
brr=np.load('arr1.npy')#读取文件
brr
7.2 多个数组情况
7.2.1 np.savez() 保存
arr1 = np.arange(12).reshape(3,4)
arr2 = np.arange(10)
np.savez('arr12.npz',a1=arr1,a2=arr2)#保存的是两个数组到一个文件中
7.2.2 np.load() 读取
8 使用numpy进行统计分析
8.1 排序 sort()
8.1.1 一维数组排序
8.1.2 多维数组排序
8.1.3 argsort() 从小到大排序,返回其相对应的索引值
8.2 unique() 去重复
8.3 重复
8.3.1 一维数组重复
8.3.2 多维数组重复
8.4 np.pad() 填充
8.5 常用统计函数
见 6.2.3 聚合函数 章节
总结
本文仅仅简单介绍了numpy库中常用的一些方法:数组的创建、属性、变换、切片、运算等,全文档请查看官方文档。
如果觉得这篇笔记对你有帮助,可以点赞,关注,收藏一下啦,我是刚刚迈上数据分析道路的小菜鸟,欢迎讨论学习,如本文知识点有误,请多多指教。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)