numpy数据分析知识总结
Numpy科学算法库
基于博客https://blog.csdn.net/m0_74344139/article/details/134842295笔记总结
NumPy,一言以蔽之,是Python中基于数组对象的科学计算库
特点
-
多维数组对象:NumPy的核心数据结构是ndarray,它是一个多维数组,用于存储同质数据类型的元素。这些数组可以是一维、二维、三维等,非常适用于向量化操作和矩阵运算。
-
广播功能:NumPy允许在不同形状的数组之间执行操作,通过广播功能,它可以自动调整数组的形状,以使操作变得有效。
-
丰富的数学函数:NumPy提供了大量的数学、统计和线性代数函数,包括基本的加减乘除、三角函数、指数和对数函数、随机数生成、矩阵操作等。
-
索引和切片:NumPy允许使用索引和切片操作来访问和修改数组中的元素,这使得数据的选择和处理非常灵活。
-
高性能计算:NumPy的底层实现是用C语言编写的,因此它在处理大规模数据时非常高效。此外,NumPy还与其他高性能计算库(如BLAS和LAPACK)集成,提供了快速的线性代数运算。
-
互操作性:NumPy可以与许多其他Python库和数据格式(例如Pandas、SciPy、Matplotlib)无缝集成,这使得数据科学工作流更加流畅。
安装anaconda环境
- 打开anaconda命令行
conda create -n ai python=3.7
默认安装路径 就是anaconda安装的目录下的envs中
系统 | Conda 环境默认路径 |
---|---|
Windows | C:\Users\<你的用户名>\anaconda3\envs\ai 或 ~miniconda3\envs\ai |
Linux / macOS | /home/<你的用户名>/anaconda3/envs/ai 或 ~/miniconda3/envs/ai |
- 切换虚拟镜像
conda activate ai
-
下载numpy
conda install numpy
-
在pycharm切换为anaconda虚拟环境即可。
注意
如果使用jupyter环境还需要下载一个
conda install jupyter
问题
- 镜像源无效
(base) C:\Windows\System32>conda create -n ai python=3.7
Retrieving notices: done
Channels:- defaults- https://mirrors.aliyun.com/anaconda/pkgs/free- https://mirrors.aliyun.com/anaconda/pkgs/main
Platform: win-64
Collecting package metadata (repodata.json): failedUnavailableInvalidChannel: HTTP 404 NOT FOUND for channel anaconda/pkgs/free <https://mirrors.aliyun.com/anaconda/pkgs/free>
The channel is not accessible or is invalid.
You will need to adjust your conda configuration to proceed.
Use conda config --show channels to view your configuration's current state,
and use conda config --show-sources to view config file locations.
解决
-
删除旧的镜像源 依次执行命令,问题解决
conda config --remove channels https://mirrors.aliyun.com/anaconda/pkgs/free conda config --remove-key channels conda config --add channels defaults conda config --add channels conda-forge conda config --set channel_priority strict
具体api
本机运行环境jupyter
导入numpy
import numpy as np
创建一维数组
data = np.array([1,2,3])
data
array(1,2,3)
#%%
创建二维数组矩阵
data = np.array([[1,2,3],[4,5,6]])
data
[[1 2 3][4 5 6]]
创建全为0的数组
两行三列的数组
data = np.zeros(shape=(2,3))
data
[[0. 0. 0.][0. 0. 0.]]
创建全为1的数组
5行3列的数组
data = np.ones(shape=(5,3))
data
[[1. 1. 1.][1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
创建全空数组
如果创建出来不是全部为空也不是这个方法的bug,而是empty的方法呢他的看是否有变量初始化过,如果被初始化了那么就会去垃圾回收机制里面去找一个值,如果没有就会是随机值
data1 = np.empty(shape=(5,3))
data1
[[1. 1. 1.][1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
创建有连续序列的数组
arange 范围是1-20 步长是2 ---->1,3,…
data = np.arange(1,20,2)
data
array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19])
#%%
创建有连续间隔的数组 linspace
开始为1 结束为2 需要有20个元素 按照从大到小 [1,2]
data = np.linspace(1,2,20)
data
array([1. , 1.11111111, 1.22222222, 1.33333333, 1.44444444,
1.55555556, 1.66666667, 1.77777778, 1.88888889, 2. ])
创建随机数组 创建3行4列的随机数
data = np.random.rand(3,4)
data
还可以创建整数的数组
—> 整数 1-10 , 矩阵为3行4列 包头不包尾 [1,10)
data = np.random.randint(1,10,size=(3,4))
data[[0.33873036 0.8257828 0.62382205 0.62767431][0.65786235 0.66304333 0.99339641 0.18908504]
[0.59778931 0.66433449 0.00201582 0.01999364]]
改变数组形状
data1=[1,2,3,4,5]
data2=[5,2,1,3,2]
data=np.array([data1,data2])
data
data.shape # 2行5列
(2,5)
修改对应的形状 (维度)
改成5行2列
data = data.reshape(5,2)
data.shape
(5,2)
数组转置
data = np.array([[1,2,3,4],[4,5,6,7],[4,5,6,7]])
print(data)
data_arr = np.array(data)
data_arr
data_arr.T # 转置就是行变列,列变行
数组维度
data = np.array([[1,2,3,4],[4,5,6,7],[4,5,6,7]])
print(data)
data.ndim # 打印数组结构 这是一个二维数组data = np.zeros(shape=(3,4,2))
datadata.ndimdata.shape
数组中元素个数
data.size
数据类型
data.dtype
数组运算
data1 = np.array([1,2,3])
data2 = np.array([4,5,6])
data1+data2 # 直接相加
data1 * data2 # 直接乘
平均值
#numpy.mean(arr, axis=None, dtype=None, out=None): 计算数组的平均值。
参数axis表示沿着哪个轴进行计算,默认为None,表示计算整个数组的平均值;
dtype表示返回结果的数据类型,默认为float64;
out表示将结果存储在指定的数组中,一般情况下,传个数组进去就可以了,其他的用默认的就好了
data = np.array([1,2,3,4,5])
mean = np.mean(data)
meandata=[1,0,6,9]
data1=np.median(data)
print(data1)
计算数组的标准差
标准差是什么
数据相对于其平均值的波动程度有多大,它主要用于衡量数据的波动程度、离散程度或稳定性
标准差是描述数据离散程度,数据离散程度越小,数据越集中,数据离散程度越大,数据越分散。
标准差的计算
样本标准差
例如用这样一组数据
x=[2,4,4,4,5,5,7,9]
- 求出平均值
mˉ=1n∑i=1n \bar{m} = \frac{1}{n} \sum_{i=1}^{n} mˉ=n1i=1∑n
meanˉ=2+4+4+4+5+5+7+98=5 \bar{mean} = \frac{2+4+4+4+5+5+7+9}{8} = 5 meanˉ=82+4+4+4+5+5+7+9=5
- 求平方差的平均值(方差)
拿里面的值减去 平均值 在进行一个开方 最后的和 乘一个 (n-1) 元素个数的长度-1
s2ˉ=1n−1∑i=1n(xi−mˉ)2 \bar{s^2} = \frac{1}{n-1} \sum_{i=1}^{n}(x_i - \bar{m})^2 s2ˉ=n−11i=1∑n(xi−mˉ)2
s2=(2−5)2+(4−5)2+1+1+0+0+4+167≈4.571 s^2 = \frac{(2-5)^2+(4-5)^2+1+1+0+0+4+16}{7} \approx 4.571 s2=7(2−5)2+(4−5)2+1+1+0+0+4+16≈4.571
- 求出标准差(开根号)
s=4.571≈2.14 s = \sqrt{4.571} \approx 2.14 s=4.571≈2.14
如何评判是否稳定
1. 变异系数(CV)
CV=标准差均值×100% CV = \frac{标准差}{均值} \times 100\% CV=均值标准差×100%
- 如果 CV < 10%:说明波动很小,数据很稳定
- 如果 CV ≈ 10%~30%:一般波动
- 如果 CV > 30%:波动较大或不稳定
CV=2.145×100%≈42.8% CV = \frac{2.14}{5} \times 100\% \approx 42.8\% CV=52.14×100%≈42.8%
说明:这组数据波动还是挺大的(>30%),不稳定,比较分散。
2. 看标准差占数据范围的比例
极差
Range=max(x)−min(x)=9−2=7
Range = max(x) - min(x) = 9 - 2 = 7
Range=max(x)−min(x)=9−2=7
求值
σRange=2.147≈30.6%
\frac{\sigma}{Range} = \frac{2.14}{7} \approx 30.6\%
Rangeσ=72.14≈30.6%
这组数据波动还是挺大的(>30%),不稳定,比较分散
x=[2,4,4,4,5,5,7,9]
std = np.std(x)
std
2.14
方差
场景
作用 | 说明 |
---|---|
数据分散度衡量 | 判断数据波动大小 |
特征筛选 | 去除低方差无用特征 |
偏差-方差权衡 | 控制模型过拟合与欠拟合 |
模型稳定性评估 | 评估模型性能波动 |
生成模型参数 | 用于描述概率分布中的散布程度 |
data = np.var(x,ddof=1)
data
4.51
计算数组的最小值
numpy.min(arr, axis=None, out=None): 计算数组的最小值。参数axis和out的含义与numpy.mean()相同。
计算数组的最大值
numpy.max(arr, axis=None, out=None): 计算数组的最大值。参数axis和out的含义与numpy.mean()相同
计算数组的元素之和
numpy.sum(arr, axis=None, dtype=None, out=None): 计算数组的元素之和。参数axis、dtype和out的含义与numpy.mean()相同。
计算数组的元素乘积
numpy.prod(arr, axis=None, dtype=None, out=None): 计算数组的元素乘积。参数axis、dtype和out的含义与numpy.mean()相同
计算数组的累积和
numpy.cumsum(arr, axis=None, dtype=None, out=None): 计算数组的累积和。参数axis、dtype和out的含义与numpy.mean()相同。
函数
- np.append():在数组末尾添加值
- np.insert():在给定索引值前一个值插入相应的值
- np.del():从输入数组中删除指定的子数组
- np.unique():删除数组中重复元素
- np.sort():对输入数组排序,并返回一个数组副本
切片
一维切片
切片操作是左闭右开的,即包括起始位置,但不包括结束位置,很简单不在赘述
# 一维数组切片
data = np.array([1,2,3,4,5,6,7,8,9])
data[0:3] # 从0开始到3结束
多维切片
二维的时候就是理解为行列
超过二维就理解为页,行,列
3维
# 多维数组切片
data1=[1,2,3,4,5]
data2=[6,7,8,9,10]
data3=[11,12,13,14,15]
data4=[16,17,18,19,20]
data5=[21,22,23,24,25]
data6=[26,27,28,29,30]
data=np.array([[data1,data2,data3],[data4,data5,data6]])
data
- data[0:1,2:3] 表示 0 到第1页的,2行到3行,所有列的数据, 其实是有三个后面省略的参数就是默认所有
比如说4维
维度编号 | 含义 | 值 |
---|---|---|
第0维 | 有2个“块” | 2个立方体 |
第1维 | 每块有3个“页/面” | 3页矩阵 |
第2维 | 每页有4行 | 行数 = 4 |
第3维 | 每行有5个元素 | 列数 = 5 |
总结:不管是列取片,还是行取片,你都去一维一维的去进行拆分,一维一维的去切片就好了
数组堆叠
垂直堆叠
# 数组堆叠
data1=[1,2,3,4,5]
data2=[6,7,8,9,10]
data4 = np.array([data1,data2]) # (用于构造矩阵)的时候用
data3 = np.vstack([data1,data2]) # (清洗好的数据)用垂直拼接
水平堆叠
# 水平堆叠
data1 = [1, 2, 3]
data2 = [4, 5,6]
data3 = np.hstack([data1, data2])
print(data3) # 横着排
保存数组到文件
# 保存数组到文件
np.save('my_array.npy', data)
AI生成项目python
运行
加载数组
# 加载数组
loaded_data = np.load('my_array.npy')