Python深度学习个人库Numpy笔记系列(第一篇)

一.Numpy库简介

NumPy 是 Python 中进行科学计算和数值处理的基础库,提供了高性能的多维数组对象(ndarray)和大量针对数组的操作函数。

1.1功能应用

  1. 允许不同形状的数组在数学运算中“自动扩展”以便执行矢量化运算。使得代码更简洁、运算更高效。
  2. 支持对整个数组执行元素级的操作,避免使用 Python 的循环,从而显著提升性能。
  3. 包括基本的算术运算、三角函数、指数函数、对数函数等,均以“通用函数(ufuncs)”的形式提供,这些函数对数组内每个元素进行操作。
  4. NumPy 提供了矩阵乘法、求逆、特征值分解、奇异值分解等丰富的线性代数操作,支持高效的矩阵计算
  5. 支持生成各种分布的随机数据,常用于模拟、数据采样等场景。
  6. 支持使用整数、布尔值、切片、甚至多维数组进行高效索引与切片操作,极大地方便了数据选取与处理。

二.数组创建

2.1创建普通数组

函数:np.array()

功能:将列表、元组或其他序列转换为 ndarray 对象

()中间还需要[]括起来要创建的数组,不同[]直接用,隔开,表示多维数组

一维数组:

import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr)

二维数组:

import numpy as np
arr = np.array([[1, 2], [3, 4]])
print(arr)

2.2特殊数组

2.2.1全零数组

函数:np.zeros(shape)

功能:创建一个指定形状的数组,并用零填充

import numpy as np
arr = np.zeros([2,4])
print(arr)

2.2.2全一数组

函数:np.ones(shape)

功能:创建一个指定形状的数组,并用1填充

import numpy as np
arr = np.ones([2,4,3])
print(arr)

2.2.3指定形状数组

函数:np.empty(shape)

功能:创建一个指定形状的数组,但只分配内存空间不赋值

import numpy as np
arr = np.empty([2,4])
print(arr)

2.2.4等差序列数组

函数:np.arange(start,stop,step)

功能:创建一个等差数列的数组,从start开始创建,步长为step,最后不包括stop

import numpy as np
data = np.arange(start,stop,step) 
print(data)

2.2.5等间隔数组

函数:np.linspace(start, stop, num)

功能:从start开始,到stop结束,创建共num个元素的数组。在指定区间内生成等间隔的数值,返回数组

import numpy as np
arr = np.linspace(0, 1, 5) 
print(arr)

np.arange和np.linspace的区别:

1.arrange最后一个参数为步长,明确知道步长,且不包含stop的值

2.linspace最后一个参数为个数,需要确定的样本数量,并希望stop也包含

表 1 函数区别

特性

np.arange

np.linspace

区间类型

半开区间 [start, stop)

闭区间 [start, stop]

控制方式

步长 step 控制

元素数量 num 控制

arr1 = np.arange(2,10,2)  #[2 4 6 8]
arr2 = np.linspace(0, 1, 5)  #[0.0, 0.25, 0.5, 0.75, 1.0]

2.2.6随机数组

函数:np.random.rand(n,m):创建n行m列数组,内容随机,范围为0-1

import numpy as np
data = np.random.rand(3,4) 
print(data)

函数: np.random.randint(a,b,size=(n,m)):创建n行m列数组,内容随机,范围为a-b(不包括b

import numpy as np
data=np.random.randint(2,5,size=(4,5));
print(data)

三.数组基本操作

NumPy 支持对数组进行逐元素的加、减、乘、除等运算,称为向量化运算

3.1数组形状与重构

1.array.shape获取数组形状(行数,列数)

import numpy as np
data=np.array([[1,2],[2,4]]);
print(data.shape)  #(2, 2)

2.array.reshape(new_shape)返回一个新视图,将数组重构为指定形状(总元素个数必须一致

import numpy as np
data=np.array([[1,2],[2,4]]);
print(data.reshape(1,4))  #[[1 2 2 4]]

3.array.astype(type) :改变数组格式(type输入int,float就可以改为指定格式)

import numpy as np
data=np.array([1,2])
print(data.astype(float))  #[1. 2.]

4.array.dtype: 获取数组数据类型

import numpy as np
data=np.array([1,2])
print(data.dtype)  #int32

5.array.T返回转置后的数组(二维数组常用)

6.array.ndim: 获取数组维度(一维或者二维)

import numpy as np
data=np.random.rand(2,5,3)
print(data.ndim)  #3

7.array.size: 获取数组元素个数

import numpy as np
data=np.random.rand(4,5,3)
print(data.size)  #60

3.2常用统计函数

1.np.sum(arr)求数组所有元素之和

2.np.mean(arr)求平均值

3.np.median(arr)求中位数

4.np.min(arr) np.max(arr)求最小和最大值

import numpy as np
data=np.array([[4,8,9],[6,7,1],[2,3,5]])
print(data.sum())  #45
print(data.mean())  #5.0
print(data.max())  #9
print(data.min())  #1
print(np.median(data))  #5.0

5.np.std(arr, axis=None, dtype=None, out=None):计算数组的标准差(std: standard deviation)。参数axis、dtype和out的含义与numpy.mean()相同

6.np.var(arr, axis=None, dtype=None, out=None):计算数组的方差(var: variance)。参数axis、dtype和out的含义与numpy.mean()相同

7.np.prod(arr, axis=None, dtype=None, out=None):计算数组的元素乘积(prod: product)。参数axis、dtype和out的含义与numpy.mean()相同

8.np.cumsum(arr, axis=None, dtype=None, out=None):计算数组的累积和(cumsum: cumulative sum)。参数axis、dtype和out的含义与numpy.mean()相同

import numpy as np
data=np.array([[4,8,9],[6,7,1],[2,3,5]])
print(data.std())  #2.581988897471611
print(data.var())  #6.666666666666667
print(data.prod())  #362880
print(data.cumsum())  #[ 4 12 21 27 34 35 37 40 45]

3.3线性代数

需要导入子模块numpy.linalg,提供了高效的矩阵运算功能,包括矩阵求逆、特征值计算、行列式、解线性方程组等

1.np.dot(a, b) 或 a.dot(b):矩阵乘法(向量点乘)

import numpy as np
arr1 = np.array([[1,-1,3],[0,1,2],[0,0,2]])
arr2 = np.array([[7,4,-1],[4,7,-1],[-4,8,4]])
print(np.dot(arr1,arr2))
"""
[[-9 21 12]
[-4 23  7]
[-8 16  8]]
"""

2.np.linalg.inv(a):矩阵求逆。

3.np.trace(a):求矩阵的迹

4.np.linalg.det(a):求矩阵行列式

5.np.linalg.norm(a):计算向量或矩阵的范数(默认为L2欧几里得范数)

6.np.linalg.solve(a,b: 求解线性方程组 ax = b,其中 A 为系数矩阵,b 为常数向量

import numpy as np
a= np.array([[2, 1, 0, 0],[1, 2, 1, 0],[0, 1, 2, 1],[0, 0, 1, 2]])
b = np.array([1, 2, 3, 4])
print(np.linalg.inv(a))  
print(np.trace(a))  
print(np.linalg.det(a))
print(np.linalg.norm(a))
print(np.linalg.solve(a,b))

7.np.linalg.eig(a): 计算方阵的特征值和特征向量

import numpy as np
data=np.array([[1,-1,3],[0,1,2],[0,0,2]])
eig1,eig2=np.linalg.eig(data)
eig1=np.round(eig1,2)
eig2=np.round(eig2,2)
print(eig1)  #[1. 1. 2.]
print(eig2)   
""" 
[[1.   1.   0.41]
[0.   0.   0.82]
[0.   0.   0.41]]
"""

8.np.linalg.eigh(a): 针对对称矩阵优化的特征分解

import numpy as np
a = np.array([[2, 1, -1],[1, 3, 0],[-1, 0, 1]])
eigh1,eigh2 = np.linalg.eigh(a)
eigh1 = np.round(eigh1,3)
eigh2 = np.round(eigh2,3)
print(eigh1)
print(eigh2)

3.4切片操作

3.4.1一维数组切片

函数:array[start:stop+1]

通过指定起始位置和结束位置来获取数组中的一部分元素,切片操作是左闭右开的,即包括起始位置,但不包括结束位置

import numpy as np
arr = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90])
print(arr[2:6])       # [30 40 50 60]
print(arr[:5])        # [10 20 30 40 50]
print(arr[5:])        # [60 70 80 90]
print(arr[::2])       # [10 30 50 70 90]
print(arr[::-1])      # [90 80 70 60 50 40 30 20 10]
print(arr[-3:])       # [70 80 90]
print(arr[-5:-2])     # [50 60 70]

3.4.2多维数组切片

函数:array[row_slice, col_slice]

在多维数组切片中,每个逗号,分隔的部分对应一个维度,: 表示该维度上所有的元素,不包含最后结尾,前后没有数字表示获取当前维度全部元素。具体的索引或切片操作则决定了选取哪部分数据。

import numpy as np


arr_2d = np.array([
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
    [13, 14, 15, 16]
])
print(arr_2d[1:3, 2:4])  # [[ 7  8], [11 12]]
print(arr_2d[:, 1:3])    # [[ 2  3], [ 6  7], [10 11], [14 15]]
print(arr_2d[2:, :])     # [[ 9 10 11 12], [13 14 15 16]]
print(arr_2d[-1:, -1:])  # [[ 16 ]]
print(arr_2d[::2, :])    # [[ 1  2  3  4], [ 9 10 11 12]]


arr_3d = np.array([
    [[1, 2], [3, 4]],
    [[5, 6], [7, 8]]
])
print(arr_3d[0, :, :])  # [[ 1 2], [ 3 4]]
print(arr_3d[:, 0, :])  # [[ 1 2], [ 5 6]
print(arr_3d[:, :, 1])  # [[ 2 4], [ 6 8]]

作者:孜宸润泽

物联沃分享整理
物联沃-IOTWORD物联网 » Python深度学习个人库Numpy笔记系列(第一篇)

发表回复