本文章来源于: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表示按行运算
点积运算(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)
        函数汇总
上面只是部份示例,下面从官网找到了一个比较全的示例:
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])] | 
总结
- 数学运算:覆盖指数、对数、三角函数等基本运算。
 - 比较与逻辑:支持逐元素的布尔运算。
 - 统计计算:提供均值、方差、分位数等统计量。
 - 线性代数:矩阵乘法、求逆、特征值分解等。
 - 数组操作:排序、去重、条件筛选等。
 
更多应用
音频文件
一段音频可以存为一个一维数组,通过切片法可以剪辑任意一段:
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)
使用图的形式直观展示出来是不是容易理解多了~