人工智能基础-NumPy-向量矩阵数组库

本文章来源于:github.com/Zeb-D/my-re... ,请star 强力支持,你的支持,就是我的动力。


背景

python三大库numpy,pandas以及matplotlib在人工智能领域有广泛的营运。下面我将介绍一些关于Numpy的一些简单教程

Numpy是什么?

NumPy (Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。

numpy的优点在于,他的大部分代码都是用c编写的,所以它在实现起来比python的代码有了更高的性能。

Numpy主要用于数据分析,整体的模式有点类似于小型的R,在读取和处理数据上略占优势,但是R的强大在于其统计分析和可视化。

基本用法

数组

通过传递给np.array()函数一个list对象,来创建一个数组

scss 复制代码
    # 构建数组
    np.array([1,2,3])
    print(np.ones(3,dtype=str)) # ['1' '1' '1']
    print(np.random.random(3))  # [0.19142482 0.55526267 0.62837514]

矩阵

与数组的构建写法相同,但是不同的是矩阵可以包含二维关系,同样包含ones()、zeros() 和 random.random() 快速方法

lua 复制代码
    # 构建矩阵
    print(np.array([[1, 2], [3, 4]]))
    print(np.zeros((3, 2),dtype=int))

提取子集

使用下标和切片提取,python的下标是从0开始的:

scss 复制代码
    print("提取子集")
    data = np.array([[1, 2], [3, 4], [5, 6]])
    print(data)
    print(data[0, 1]) # 0行1列 # 输出 2
    # print(data[3, 2]) # 3行2列 # 直接报错
    print(data[1:4]) # 输出1到4行元素,越界不会报错
    print(data[1:3, ])
    print(data[0:2, 0]) #输出0到2行的 0列元素

数组转置与reshape()

转置:行变成列,列变成行

scss 复制代码
    print("数组转置与reshape()")
    data = np.array([[1, 2], [3, 4], [5, 6]])
    print(data)
    print(data.T) # 你可以理解行与列的下标互换
    
    print("reshape")
    data = np.array([1, 2, 3, 4, 5, 6])
    print(data.reshape(2, 3)) # 将一维数组变成2行3列数组
    # print(data.reshape(2, 2)) # 元素剩余会报错
    # print(data.reshape(3, 3)) # 元素不够会报错

数组运算

加减乘除等数学运算

scss 复制代码
    print("矩阵可以进行加减乘除等数学运算:")
    data = np.array([[1, 2], [3, 4]])
    ones = np.ones((2,2))  # 1行2列
​
    ad = data + ones  # 对应下标进行相加
    print(ad)
    print(data - ones)  # 相减
    print(data * data)  # 逐元素相乘
    print(data / data)
    print(data * 1.6)

最小值/最大值/平均值

python 复制代码
    print("最小值/最大值/平均值等")
    print(data.max())
    print(data.max(axis=1))  # 按行分组计算最大值
    print(data.min())
    print(data.sum())
    print("所有元素的乘积:", data.prod())  # 1*2*3*4 = 24
    print("标准差(std):", data.std())  # √(方差) ≈ 1.118
    print("方差(var):", data.var())  # 方差 = 1.25
    print("矩阵平方:", np.square(data))  # 矩阵平方

上面这些方法都有参数 axis=0表示按列运算,axis=1表示按行运算

更多的运算见:jakevdp.github.io/PythonDataS...

点积运算(dot)

这个运算看起来比较像线性代数里面的两个矩阵相乘:

lua 复制代码
    print("点积运算(dot)")
    data1 = np.array([1, 2, 3])
    data2 = np.array([[1, 10], [100, 1000], [10000, 100000]])
    print(data1.dot(data2))  # 输出线性代数的矩阵相乘,不是简单上面的逐元素相乘*
​

公式要求行数必须等于另外一个矩阵的列数,即矩阵m * n 和矩阵n * j ,最终得到另外一个矩阵的m * j 维数组。

高级运算

除了向量和矩阵支持运算外,公式的使用也是 NumPy 成为宠儿的原因之一。

例如在解决回归问题中监督式机器学习的核心公式:均方差公式

lua 复制代码
    print("高级运算")
    print("均方差公式")
    n = 6
    predictions = np.array([[1, 2, 3], [4, 5, 6]])
    labels = np.ones((2, 3))
    error = (1 / n) * np.sum(np.square(predictions - labels)) # np.square 为矩阵的平方
    print(error)

函数汇总

上面只是部份示例,下面从官网找到了一个比较全的示例:

numpy.org/doc/stable/...

1. 数学运算函数

函数 说明 示例 输出示例
np.exp(x) 自然指数 exe**x np.exp([1, 2]) [2.718, 7.389]
np.expm1(x) ex−1e**x−1(高精度小值计算) np.expm1([0, 1e-10]) [0., 1e-10]
np.log(x) 自然对数 ln⁡(x)ln(x) np.log([1, np.e]) [0., 1.]
np.log10(x) 以 10 为底的对数 np.log10([1, 100]) [0., 2.]
np.log2(x) 以 2 为底的对数 np.log2([1, 8]) [0., 3.]
np.log1p(x) ln⁡(1+x)ln(1+x)(高精度小值) np.log1p([0, 1e-10]) [0., 1e-10]
np.sqrt(x) 平方根 xx np.sqrt([4, 9]) [2., 3.]
np.square(x) 平方 x2x2 np.square([2, 3]) [4, 9]
np.abs(x) 绝对值 np.abs([-1, 2]) [1, 2]
np.ceil(x) 向上取整 np.ceil([1.2, -1.7]) [2., -1.]
np.floor(x) 向下取整 np.floor([1.7, -1.2]) [1., -2.]
np.round(x) 四舍五入 np.round([1.4, 1.6]) [1., 2.]
np.sign(x) 符号函数(-1, 0, 1) np.sign([-5, 0, 5]) [-1, 0, 1]
np.sin(x) 正弦(弧度制) np.sin(np.pi/2) 1.0
np.cos(x) 余弦(弧度制) np.cos(0) 1.0
np.tan(x) 正切(弧度制) np.tan(np.pi/4) ≈1.0
np.arcsin(x) 反正弦 np.arcsin(0.5) ≈0.5236
np.arccos(x) 反余弦 np.arccos(0.5) ≈1.0472
np.arctan(x) 反正切 np.arctan(1) ≈0.7854
np.sinh(x) 双曲正弦 np.sinh(0) 0.0
np.cosh(x) 双曲余弦 np.cosh(0) 1.0
np.tanh(x) 双曲正切 np.tanh(0) 0.0
np.deg2rad(x) 角度转弧度 np.deg2rad(180) ≈3.1416
np.rad2deg(x) 弧度转角度 np.rad2deg(np.pi) 180.0

2. 比较运算函数

函数 说明 示例 输出示例
np.equal(x, y) 逐元素相等比较 np.equal([1, 2], [1, 3]) [True, False]
np.not_equal(x, y) 逐元素不等比较 np.not_equal([1, 2], [1, 3]) [False, True]
np.greater(x, y) 逐元素 x > y np.greater([2, 1], [1, 2]) [True, False]
np.greater_equal(x, y) 逐元素 x ≥ y np.greater_equal([2, 1], [1, 1]) [True, True]
np.less(x, y) 逐元素 x < y np.less([1, 2], [2, 1]) [True, False]
np.less_equal(x, y) 逐元素 x ≤ y np.less_equal([1, 2], [1, 1]) [True, False]

3. 逻辑运算函数

函数 说明 示例 输出示例
np.logical_and(x, y) 逐元素逻辑与 np.logical_and([True, False], [True, True]) [True, False]
np.logical_or(x, y) 逐元素逻辑或 np.logical_or([True, False], [False, False]) [True, False]
np.logical_not(x) 逐元素逻辑非 np.logical_not([True, False]) [False, True]
np.logical_xor(x, y) 逐元素逻辑异或 np.logical_xor([True, False], [True, True]) [False, True]

4. 统计运算函数

函数 说明 示例 输出示例
np.sum(x) 所有元素求和 np.sum([1, 2, 3]) 6
np.mean(x) 所有元素均值 np.mean([1, 2, 3]) 2.0
np.median(x) 中位数 np.median([1, 3, 2]) 2.0
np.std(x) 标准差 np.std([1, 2, 3]) ≈0.816
np.var(x) 方差 np.var([1, 2, 3]) ≈0.666
np.min(x) 最小值 np.min([1, 2, 3]) 1
np.max(x) 最大值 np.max([1, 2, 3]) 3
np.percentile(x, q) q 分位数 np.percentile([1, 2, 3], 50) 2.0
np.cumsum(x) 累积和 np.cumsum([1, 2, 3]) [1, 3, 6]
np.cumprod(x) 累积积 np.cumprod([1, 2, 3]) [1, 2, 6]

5. 线性代数函数

函数 说明 示例 输出示例
np.dot(A, B) 矩阵乘法 np.dot([1, 2], [[3], [4]]) 11
np.matmul(A, B) 矩阵乘法(推荐) np.matmul([[1, 2]], [[3], [4]]) [[11]]
np.linalg.inv(A) 矩阵求逆 np.linalg.inv([[1, 2], [3, 4]]) [[-2, 1], [1.5, -0.5]]
np.linalg.det(A) 行列式 np.linalg.det([[1, 2], [3, 4]]) -2.0
np.linalg.eig(A) 特征值和特征向量 np.linalg.eig([[1, 2], [2, 1]]) 返回特征值和向量
np.linalg.svd(A) 奇异值分解 np.linalg.svd([[1, 2], [3, 4]]) 返回 U, Σ, V

6. 数组操作函数

函数 说明 示例 输出示例
np.unique(x) 返回唯一值 np.unique([1, 2, 2, 3]) [1, 2, 3]
np.sort(x) 排序 np.sort([3, 1, 2]) [1, 2, 3]
np.argsort(x) 排序索引 np.argsort([3, 1, 2]) [1, 2, 0]
np.clip(x, a, b) 限制范围 np.clip([0, 5, 10], 1, 9) [1, 5, 9]
np.where(cond, x, y) 条件选择 np.where([True, False], [1, 2], [3, 4]) [1, 4]
np.concatenate((a,b)) 数组拼接 np.concatenate(([1, 2], [3, 4])) [1, 2, 3, 4]
np.split(x, indices) 数组分割 np.split([1, 2, 3, 4], [2]) [array([1, 2]), array([3, 4])]

总结

  1. 数学运算:覆盖指数、对数、三角函数等基本运算。
  2. 比较与逻辑:支持逐元素的布尔运算。
  3. 统计计算:提供均值、方差、分位数等统计量。
  4. 线性代数:矩阵乘法、求逆、特征值分解等。
  5. 数组操作:排序、去重、条件筛选等。

更多应用

音频文件

一段音频可以存为一个一维数组,通过切片法可以剪辑任意一段:

CD 质量的音频每秒包含 44,100 个样本,每个样本是-65535 到 65536 之间的整数。这意味着如果你有一个 10 秒的 CD 质量 WAVE 文件,你可以将它加载到长度为 10 * 44,100 = 441,000 的 NumPy 数组中

图像Images

图像是像素大小 (高度 x 宽度) 的矩阵。

如果图像是黑白的 (也称为灰度) ,每个像素可以用一个数字表示 (通常介于 0 (黑色) 和 255 (白色) 之间)。想要裁剪图像左上角 10 x 10 像素的部分吗?使用numpy

如果图像是彩色的,那么每个像素用三个数字表示 ------ 红色、绿色和蓝色各一个值。在这种情况下,我们需要一个三维 (因为每个单元格只能包含一个数字)。所以一个彩色图像是由一个3维数组表示的: (高 x 宽 x 3)

使用图的形式直观展示出来是不是容易理解多了~

相关推荐
石榴花专场2 分钟前
分类算法中one-vs-rest策略和one-vs-one 策略的区别是什么?
人工智能·python·机器学习·数据挖掘
youcans_4 分钟前
【医学影像 AI】早产儿视网膜病变国际分类(第三版)
论文阅读·人工智能·计算机视觉·医学影像·rop
神经星星7 分钟前
多主体驱动生成能力达SOTA,字节UNO模型可处理多种图像生成任务
人工智能·开源·强化学习
不辉放弃9 分钟前
第一章:MySQL视图基础
python·mysql
hello_ejb310 分钟前
聊聊Spring AI Alibaba的FeiShuDocumentReader
人工智能·python·spring
何双新11 分钟前
企业AI应用模式解析:从本地部署到混合架构
人工智能·架构
深度学习lover11 分钟前
<数据集>小船识别数据集<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·船舶识别
带娃的IT创业者13 分钟前
《AI大模型应知应会100篇》第30篇:大模型进行数据分析的方法与局限:从实战到边界探索
人工智能·数据挖掘·数据分析
小杰love编程17 分钟前
下载pycharm遇到的问题及解决方法
python·pycharm·django·flask·开发软件
白熊18818 分钟前
【计算机视觉】CV实战项目- CMU目标检测与跟踪系统 Object Detection & Tracking for Surveillance Video
人工智能·目标检测·计算机视觉