视频加载失败

数据分析包Numpy-Pandas-Matplotlib

1850 字
9 分钟
数据分析包Numpy-Pandas-Matplotlib

Numpy#

Numpy是什么?

Numpy是一个数值计算基础库,能提供高性能的多维数组对象(ndarray).

Terminal window
# 安装命令
pip install numpy

基本语法#

创建一个ndarray有很多种方法,以下为示例

import numpy as np
if __name__ == '__main__':
# 将列表转换为numpy数组,np可自动推断数据类型
# array(<列表>[,dtype=<类型>])
# 该方法将原列表复制一份存放在np特有的格式中.
# 若要创建视图(非复制),需要使用asarray方法.使用方法同该方法.
# 注意:
# 不建议使用混合类型的列表去创建numpy数组,会降低性能.
# array方法默认为复制原列表,asarray方法默认为创建视图(引用原列表).
# 创建ndarray的方式有很多种
# 方式一: 将列表转换为ndarray.
a1 = np.array([1, 2, 3, 4, 5]) # 一维列表
a2 = np.array([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) # 二维列表
# 方式二: 创建全0的ndarray,默认类型为浮点数.
# zeros((<形状描述元组>)[,dtype=<类型>])
z1 = np.zeros(2, dtype=np.int8)
z2 = np.zeros((2, 3), dtype=np.int8)
# 方式三: 创建全1数组,默认类型为浮点数.
o1 = np.ones(2, dtype=np.int8)
o2 = np.ones((3, 4), dtype=np.int8)
# 方式四: 创建空数组,这里面的值是垃圾值.
# 值没有意义,只当确定会对数组内的内容进行全部覆盖时才会用.
# 性能比zeros和ones高一些.
ep1 = np.empty(2, dtype=np.int8)
# 方式五: 创建序列数组.
# arange(<起始值>,<终止值>,<步长>),左闭右开
ar1 = np.arange(1, 10, 2)
# 方式六: 创建等差序列数组.
# linspace(<起始值>,<终止值>,<元素数量>,endpoint=<是否包含终止值>),默认左闭右闭,创建一个等差数列.
# endpoint=True: 不包含终止值,即将终止值也计算为一个元素,但不会返回.
# 如 1,10,4,endpoint=True与1,10,5,endpoint=False的区别只差在有没有最后一个元素.
ls1 = np.linspace(1, 10, 5, endpoint=True)
# 方式七: 创建随机数组
# 随机数组有三种,均匀数组,标准正态分布数组,指定范围的随机数组.
# 均匀数组
ra1 = np.random.rand(2, 3)
# 标准正态分布数组
ra2 = np.random.randn(2, 3)
# 指定范围的随机数组,默认左闭右开
# randint(<最小值>,<最大值>,<元素数量>)
ra3 = np.random.randint(1, 10, (3, 4))

常用属性#

ndim: 获取维度维度数.

shape: 获取形状.

size: 元素数量.

dtype: 元素类型,若类型不一致,则为object.

import numpy as np
if __name__ == '__main__':
list_array = np.array([[1, 2, 3], [1, 2, 3], [1, 2, 3]])
print(list_array.ndim) # 维度数
print(list_array.shape) # 形状
print(list_array.size) # 元素数量
print(list_array.dtype) # 元素类型,若类型不一致,则为object.

形状管理#

形状是什么呢? 在返回的结果中,形状是一个元组,如(1,2),这代表了一个二维数组,其有1行2列.

reshape(<形状描述>): 修改数组的形状.

  • 元素数量不变,reshape返回的是一个视图,对视图的修改会影响到原来的数组.
  • 对于缺失一个维度大小的数组,可以使用-1进行自动计算. -1只能出现一次.
import numpy as np
if __name__ == '__main__':
ar1 = np.arange(1, 65, 1)
# 使用reshape方法修改数组的形状
# 注意: 元素数量不变,reshape方法返回的是一个视图,修改原数组的值也会影响到新数组.
# 如果能确定行或列的个数,另外一个参数可以动态计算,使用-1动态计算.只能出现1个.
ar2 = ar1.reshape(2, 4, 8)
# 转置,转置时,使用的是引用,修改转置数组会影响原数组.
# 二维时,(行,列) -> (列,行)
# 三维时,(层,行,列) -> (列,行,层)
# 更高维时,也是将维度顺序反转.
ar3 = ar2.T

T: 转置. 将数组的所有维度反转.

  • 二维时,(行,列) -> (列,行)
  • 三维时,(层,行,列) -> (列,行,层)
  • 高维同理.

运算#

数组支持所有标准数学运算.但要求数组大小满足以下条件才可以执行运算(三个条件满足其中一个即可 or).

  • 维度大小相等.
  • 其中一个维度的大小为一.
  • 其中一个数组没有该维度,视为1.
import numpy as np
if __name__ == '__main__':
a1 = np.array([4, 2, 4])
a2 = np.array([2, 1, 2])
try:
# 使用方法与使用运算符的行为一致
# 数学运算
print(f"{a1} + \n{a2} = \n{a1 + a2}\n")
print(f"{a1} - \n{a2} = \n{a1 - a2}\n")
print(f"{a1} * \n{a2} = \n{a1 * a2}\n")
print(f"{a1} / \n{a2} = \n{a1 / a2}\n")
print(f"{a1} ** \n{a2} = \n{a1 ** a2}\n")
print(f"{a1} + \n{a2} = \n{np.add(a1, a2)}\n")
print(f"{a1} - \n{a2} = \n{np.subtract(a1, a2)}\n")
print(f"{a1} * \n{a2} = \n{np.multiply(a1, a2)}\n")
print(f"{a1} / \n{a2} = \n{np.divide(a1, a2)}\n")
print(f"{a1} ** \n{a2} = \n{np.power(a1, a2)}\n")
# 逻辑运算
print(f"{a1} == \n{a2} = \n{a1 == a2}\n")
print(f"{a1} != \n{a2} = \n{a1 != a2}\n")
print(f"{a1} > \n{a2} = \n{a1 > a2}\n")
print(f"{a1} < \n{a2} = \n{a1 < a2}\n")
print(f"{a1} >= \n{a2} = \n{a1 >= a2}\n")
print(f"{a1} <= \n{a2} = \n{a1 <= a2}\n")
except Exception as e:
print(e)
# (2,4)形状的数组
a3 = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8]
])
# (4,3)形状的数组
a4 = np.array([
[1, 2, 5],
[3, 4, 5],
[5, 6, 5],
[7, 8, 5]
])
# matmul(<数组1>,<数组2>): 用于计算两个数组的矩阵乘法
# 注意: 数组1的列数必须与数组2的行数相等.
# 在本例中,数组1的列为4列,数组2的行为4行,相等,可以执行计算.
# 结果集大小: (数组1的行数,数组2的列数)
print(f"{a3} * \n{a4} = \n{np.matmul(a3, a4)}\n")

广播机制#

是什么? 当Numpy需要计算两个形状不同的数组时,会在不复制数据的前提下,“虚拟扩展”较小的数组,使其形状与较大数组形状兼容,避免显式复制和循环.

规则1: 维度数不同时,给维度较少的数组,在左侧补1.

  • Numpy在计算数组时会先进行对齐,对齐是从右到左进行对齐的.缺失的维度视为1且只会补齐左侧的维度,右侧的维度是不会被补齐的.

    如A.shape: (3,) 与 B.shape: (2,3), 运算时,会这样处理

    1. 检查维度缺失: 发现A缺少维度,从右到左运算,将A补齐缺失维度: (1,3)
    2. 检查是否可广播: A进行广播(匹配规则3): (2,3)

规则2: 某一维度的长度要么相等,要么其中一个为1.

  • 若两个数组在同一维度上长度不相等,也没有一个是1,则无法广播.

规则3: 长度为1的维度在运算时可被广播

  • 若两个数组在同一维度上长度不相等,维度为1,则维度为1的维度,会被广播.

    如A.shape: (2,2,3,4) 与 B.shape: (1,2,3,4),运算时,会这样处理

    1. 检查维度缺失: 未发现维度缺失
    2. 检查是否可广播: 发现B在第一维度为1,所以将B进行广播 B.shape: (2,2,3,4)

规则4: 输出形状取各维度上的最大值

  • 运算结果的每一维度的大小,等于参与运算数组在该维度上的最大长度

    如A.shape: (8,1,6,1)与B.shape: (7,1,5)运算时,会这样处理

    1. 检查维度缺失: 发现B缺失维度,从右到左运算,将B补齐缺失维度: (1,7,1,5)
    2. 检查是否可广播: 发现A与B在每一维度都对应不上,但对应的维度上都为1,所以将A与B同时进行广播 A.shape: (8,7,6,5),B.shape: (8,7,6,5)

但总结下来,实际上就两步

  1. 检查维度缺失,进行补齐
  2. 检查是否可广播,进行拉伸

Pandas#

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
数据分析包Numpy-Pandas-Matplotlib
https://kulve.tech/posts/yuili/python笔记/数据分析包numpy-pandas-matplotlib/
作者
Kulve
发布于
2026-08-15
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Kulve
Hello, I'm Kulve.
公告
你好,欢迎来到我的博客
分类
标签
最新动态
站点统计
文章
17
分类
8
标签
23
总字数
29,467
运行时长
0
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.7
文章许可
CC BY-NC-SA 4.0
文章目录