10.3月11 数据分析三剑客的使用—numpy
数据分析三剑客
数据分析三剑客是指 NumPy、Pandas 和 Matplotlib 这三个 Python 库。它们是数据分析领域最常用的工具,可以满足大多数数据分析需求。
NumPy 是一个用于科学计算的 Python 库。它提供了一个强大的 n 维数组对象,并支持大量的数学函数。NumPy 非常适合处理数值数据,例如进行矩阵运算、统计分析等。
Pandas 是一个用于数据分析的 Python 库。它提供了一系列用于处理结构化数据的工具,例如数据框、时间序列等。Pandas 非常适合处理表格数据,例如进行数据清洗、转换、分析等。
Matplotlib 是一个用于数据可视化的 Python 库。它提供了一系列用于绘制各种图形的工具,例如折线图、柱状图、饼图等。Matplotlib 非常适合将数据以直观的方式呈现出来。
基本了解
NumPy
- 创建和操作 n 维数组
- 进行数学运算和统计分析
- 傅里叶变换
- 随机数生成
- 线性代数
熟练运用
Pandas
- 读取和写入各种格式的数据
- 清洗和转换数据
- 计算统计指标
- 绘制图形
- 时间序列分析
熟练运用
Matplotlib
- 绘制折线图、柱状图、饼图等
- 控制图形的各个方面
- 支持交互式绘图
- 导出图形
NumPy
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
引入库
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
import numpy as np
NumPy的数据类型
数组和列表的区分,我们先要区分数组和列表的区别
| 特性 | 数组 | 列表 |
|---|---|---|
| 元素类型 | 相同 | 不同 |
| 创建方式 | array() 函数 | list() 函数或方括号 |
| 存储方式 | 连续内存 | 链表 |
| 性能 | 更快 | 更慢 |
| 可变性 | 不可变 | 可变 |
| 用途 | 存储需要快速访问的数据 | 存储需要频繁更改的数据 |
np.array的类型是数组
维度概念
一维二维三维。。。
NumPy 元素的创建
1. 使用np.array()从list列表创建
列表:[1,4,2,5,3]
my_list=[1,4,2,5,3]
my_np=np.array(my_list)
2. 使用np的routines函数创建
包含以下常见创建方法:
- np.ones(shape,dtype=None,order='C')
- np.zeros(shape,dtype=float,order='C')
- np.full(shape,full_value,dtype=None,order='C')
- np.eye(N,M=None,k=0,dtype=float)
- np.linspace( start sto num= endpoint=T retstep=F dtype, x
- np.arange([start,] stop[, step,], dtype=None, *, like=None)
- np.random.randint(low, high=None, size=None, dtype=int)
- np.random.randn(d0, d1, ..., dn)is=0,
2.1 np.ones
np.ones(shape, dtype=None, order='C'): 创建一个给定形状(shape)和数据类型(dtype)的数组,所有元素初始化为1。
np.ones(shape=(4,2))
4,2表示什么?,默认类型为? 默认值为?
np.ones(shape=(4,2),dtype=int)
np.ones(shape=(3,2,1),dtype=int)
能否理解三维数组?
2.2 np.zeros
np.zeros(shape, dtype=float, order='C'): 创建一个给定形状和数据类型的数组,所有元素初始化为0,可以指定数据类型,默认为浮点数。
np.zeros(shape=(4,2))
2.3 np.full
np.full(shape, full_value, dtype=None, order='C'): 创建一个给定形状和数据类型的数组,所有元素初始化为指定的值(full_value)。
np.full(shape=(4,2),fill_value=6)
2.4 np.eye
np.eye(N, M=None, k=0, dtype=float): 创建一个单位矩阵,对角线上的元素为1,其余元素为0。(不介绍)
2.5 np.linspace
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None): 在指定的范围内生成等间隔的数字,可以设置生成的数量、是否包括终点、是否返回步长等参数。
np.linspace(10,25,num=15,dtype=int,axis=0,)
python
np.linspace(10,25,num=10,dtype=None,axis=0,)
2.6 np.arange
np.arange([start, ] stop[, step, ], dtype=None, *, like=None): 在指定的范围内以指定的步长生成数字,类似于Python内建的 range()函数。
np.arange(0,10)
python
np.arange(0,10,step=2)
python
np.arange(10,dtype=int)
2.7 np.random.randint
np.random.randint(low, high=None, size=None, dtype=int): 生成一个指定范围内的随机整数数组,可以指定数组形状和数据类型。
np.random.randint(0, high=100, dtype=int)
python
np.random.randint(0, high=100, size=1,dtype=int)
python
np.random.randint(0, high=100,size=(2,3), dtype=int)
2.8 np.random.randn
np.random.randn(d0, d1, ..., dn): 从标准正态分布中生成随机样本,可以指定生成数组的形状。
np.random.randn(50)
python
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.displot(np.random.randn(2000))
plt.show()
python
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.distplot(np.random.normal(loc=100,scale=10,size=1000))
plt.show()
np.array的属性
4个必记参数:
- ndim:维度
- shape:形状(各维度的长度)
- size:总长度
- dtype:元素类型
import numpy as np
my_arr=np.random.randint(0,10,size=(4,3,2))
print(my_arr)
print(my_arr.ndim,my_arr.shape,my_arr.size,my_arr.dtype)
np.array的基本操作
列表的索引方式:
python
my_list=[1, 4, 2, 5, 3]
my_list[0]
1. numpu索引
索引方式和列表基本相同
1.1 元素访问
my_arr=np.random.randint(0,10,size=(4,3,2))
my_arr[0]
my_arr[0][1]
my_arr[0][1][0]
1.2 行访问/列访问(重点)
单个 : 表示所有
my_arr=np.array([[1,2,3,4],[5,6,7,8]])
my_arr
my_arr[0]
my_arr[0,:]
my_arr[:,2]
1.3 列表作为索引取值
index=[2,3,1]
my_arr=np.array([1,2,3,4,5,6,7,8])
my_arr[index]
1.4 一些用法
my_arr=np.random.randint(100,size=(4,4))
my_arr
my_arr[0:2,2:4]
my_arr[[1,3],2]
my_arr[[1,3],[0,2]]
my_arr[[1,3],:][:,[0,2]]
2. 切片
在 NumPy 中,切片(slicing)是指从数组中选择一部分元素或子数组的操作。这允许您根据需要从数组中提取出特定的数据子集,而无需复制原始数据。
my_arr=np.random.randint(0,100,size=10)
间隔取数
my_arr[::2]
倒序取数
my_arr[::-1]
my_arr=np.random.randint(0, high=100,size=(2,3), dtype=int)
print(my_arr)
print(my_arr[:,::-1])
切片对图片的应用
需要安装扩展Image Preview
import matplotlib.pyplot as plt
tu=plt.imread('./test.jpg')
print(tu.shape)
import numpy as np
import matplotlib.pyplot as plt
tu=plt.imread('./image.png')
plt.figure(figsize=(2,2))
# 行倒序
plt.imshow(tu[::-1])
plt.show()
import numpy as np
import matplotlib.pyplot as plt
tu=plt.imread('./image.png')
plt.figure(figsize=(2,2))
# 列倒序
plt.imshow(tu[:,::-1])
plt.show()
import numpy as np
import matplotlib.pyplot as plt
tu=plt.imread('./image.png')
plt.figure(figsize=(2,2))
# 颜色倒序
plt.imshow(tu[:,:,::-1])
plt.show()
3. 变形
4. 级联
5. 切分
6. 副本
所有赋值运算不会为np.array的任何元素创建副本。对赋值后的对象的操作也对原来的对象生效 这里需要区分一下:
- 浅复制,默认的,本质上复制了原先的“引用”
- 深复制,copy的内存,并产生新内存
- deepcopy,这个属于第三种,用到再说
import numpy as np
my_arry=np.random.randint(10,size=10)
my_arry_copy=my_arry
print(my_arry,my_arry_copy)
my_arry_copy[0]=11
print(my_arry,my_arry_copy)
import numpy as np
my_arry=np.random.randint(10,size=10)
# 此次深复制
my_arry_copy=my_arry.copy()
print(my_arry,my_arry_copy)
my_arry_copy[0]=11
print(my_arry,my_arry_copy)
NumPy的常用操作
1. 求和:np.sum
import numpy as np
my_arr=np.ones(shape=(4,3))
print(my_arr)
print(my_arr.sum(),my_arr.sum(axis=1),my_arr.sum(axis=0))
2. 平均值:np.mean()
#平均值
my_arr.mean()
3. 方差:np.std()
# 方差
my_arr.std()
需注意
np.nan
nan 就是空值,而np中nan与其他数运算结果都是空
my_arr=np.array([1,2,3,4,np.nan])
my_arr.sum()
np.nansum() 能忽略nan
4. 最大最小值:np.max/np.min
my_arr.max()
np.nanmax(my_arr)