Python——numpy / cupy / scipy / torch 包入门学习

numpy

Numpy 的英文全称为 Numerical Python,指 Python 面向数值计算的第三方库。Numpy 的特点在于,针对 Python 内建的数组类型做了扩充,支持更高维度的数组和矩阵运算,以 及更丰富的数学函数。下面介绍 numpy 中几个常用函数,其他函数同学们可以自行搜索了解。

(1)ndarray 的简介:numpy 有 2 种基本对象,ndarray(N-dimensional array object)和 ufunc (universal functionobject)ndarray 是存储单一数据类型的多维数组。

Numpy 中,ndarray 类具有六个参数,它们分别为:

  • shape:数组的形状。
  • dtype:数据类型。
  • buffer:对象暴露缓冲区接口。
  • offset:数组数据的偏移量。
  • strides:数据步长。
  • order:{'C','F'},以行或列为主排列顺序

ndarray 对象的内容可以通过索引或切片来访问和修改,可以基于 0 - n 的下标进行索引, 切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切 割出一个新数组。也通过冒号分隔切片参数 start:stop:step 来进行切片操作。

>>a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
>>print(a[2:5])
[2 3 4]

 

(2)import

import A as B 这种方式为给引入的包 A 定义一个别名 B。

例如:import numpy as np # 给 numpy 包定义一个 np 别名

Import:只有 import,为最简单的引入对应的包。

例如:import numpy # 引入 numpy 包

from A import B:这种方式意味着从 A 中引入 B。

例如:from urllib.parse import urlparse

 

(3)numpy.zeros(shape,dtype=float,order = 'C')返回给定形状和类型的新数组,用 0 填充。

例程:创建一个一维数组时,只需要一个参数就可以了,此参数代表数组长度。

例程:在默认的情况下,zeros 创建的数组元素类型是浮点型的,若使用其他类型可设置 dtype 参数进行声明。

 例程:创建多维数组,参数形式需要注意,如下:

 

(4)numpy 模块中的矩阵对象为 numpy.matrix,包括矩阵数据的处理,矩阵的计算,以及基本的统计功能、转置、可逆性等等,包括对复数的处理,均在 matrix 对象中。

class numpy.matrix(data,dtype,copy):返回一个矩阵,其中 data 为 ndarray 对象或者字符

形式;dtype:为 data 的 type;copy:为 bool 类型。例程 1:

>>> a = np.matrix('1 2 7; 3 4 8; 5 6 9')
>>> a	#矩阵换行用分号(;)隔开,内部数据为字符串形式(‘ ’),元素间以空格隔开 matrix([[1, 2, 7],
[3, 4, 8], [5, 6, 9]]) 

例程2:

>>> b=np.array([[1,5],[3,2]])
	>>> x=np.matrix(b)	#矩阵中的 data 可以为数组对象。
>>> x
matrix([[1, 5],
[3, 2]])

5)numpy.array() 创建数组

例程:a = np.array([2,3,4])

例程:b = np.array([[1,2],[3,4]],dtype=complex)      # 指定数据类型

 

cupy

CuPy: NumPy-like API accelerated with CUDA。CuPy 是 NumPy 兼容多维数组在 CUDA 上的实现。这个包(cupy)是一个源发行版。对于大多数用户,建议使用预构建的 wheel 分布。

CuPy 是一个开源矩阵库,使用 NVIDIA CUDA 加速。CuPy 使用 Python 提供 GPU 加速计算。CUPY 使用 CUDA 相关库,包括 CuBLAS、CUDNN、Curand、CuoSver、CuPaSeSE、Cufft 和 NCCL,以充分利用 GPU 架构。

CuPy 支持 Numpy 的大多数数组运算,包括索引、广播、数组数学以及各种矩阵变换,是基于 CDAU 实现与 NumPy 兼容的多维数组的实现。

cupy 与 numpy 可以互相转换。

>> import cupy as cp
>> import numpy as np
>> numpy_data = cp.asnumpy(cupy_data)	#cupy->numpy
>> cupy_data = cp.asarray(numpy_data)	#numpy->cupy

cupy 与 numpy 的区别:numpy 自动调用 cpu 来进行"数组和矩阵间"的计算,计算任务

默认单进程;cupy 自动调用 gpu 来进行"数组和矩阵间"的计算,gpu 中默认并行计算。 cupy 与 numpy 的联系:二者的函数和实操的功能基本完全一样,一般只需把 np.xxx()

改成 cp.xxx()即可。当然,cupy 还未完全写完,有些 numpy 的函数它还未实现(基本用不到)。

 

SciPy

Scipy 是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。

Scipy 和 Numpy 联系很密切,Scipy 一般都是操控 Numpy 数组来进行科学计算、统计分析,所以可以说是基于 Numpy 之上。Scipy 有很多子模块可以应对不同的应用,例如插值运算,优化算法等等。SciPy 则是在 NumPy 的基础上构建的更为强大,应用领域也更为广泛的科学计算包。正是出于这个原因,SciPy 需要依赖 NumPy 的支持进行安装和运行。

  Scipy 是由针对特定任务的子模块组成:

例程:傅里叶变换

from scipy.fftpack import *

N = 500 
f0 = 10 
fs = 500 
phy = [2*math.pi*f0*t/fs for t in range(N)] 
sig = [math.cos(i) for i in phy] 
sig_fft = fft(sig)

例程:解线性方程组

>>> from scipy.linalg import *
>>> A = np.array([[1,4,5], [6,4,2], [8,3,5]])
>>> b = np.array([4,6,8])
>>> x = solve(A,b) 
>>> x
array([0.625, 0.375, 0.375])

 

Torch

Torch 是一个与 Numpy 类似的张量(Tensor)操作库,它旨在提供-个灵活的深度学习开发平台,其工作流程尽可能接近 Python 的科学计算库--- numpy,与 Numpy 不同的是 Torch 对 GPU 支持的很好。

Torch 目标在于通过极其简单过程、最大的灵活性和速度建立自己的科学算法。Torch 有一个在机器学习领域大型生态社区驱动库包,包括计算机视觉软件包,信号处理,并行处理,图像,视频,音频和网络等,基于 Lua 社区建立。Torch 的核心是流行的神经网络,它使用简单的优化库,同时具有最大的灵活性,实现复杂的神经网络的拓扑结构。可以建立神经网络和并行任意图,通过 CPU 和 GPU 等有效方式。

1、

首先 torch 可定义/初始化张量 Define tensors,并进行一些基本操作和运算。tensor,即 “张量”,实际上跟 numpy 数组、向量、矩阵的格式基本一样。但是是专门针对 GPU 来设计的,可以运行在 GPU 上来加快计算效率。而 PyTorch 中定义 tensor,就跟 numpy 定义矩阵、向量差不多,例如定义一个 5×3 的 tensor,每一项都是 0 的张量: x = torch.zeros(5,3)

下面列举一些常用的定义 tensor 的方法

torch.empty(size)返回形状为 size 的空 tensor torch.zeros(size)全部是 0 的 tensor torch.ones(size)全部是 1 的 tensor torch.arange(start=0, end, step=1)返回一个从 start 到 end 的序列 torch.rand(size) [0,1)内的均匀分布随机数 torch.rand_like(input)返回跟 input 的 tensor 一样 size 的 0-1 随机数 torch.randn(size)返回标准正太分布 N(0,1)的随机数 torch.normal(mean, std, out=None)正态分布

torch.numel() 返回一个 tensor 变量内所有元素个数,可以理解为矩阵内元素的个数

torch.squeeze() 对于 tensor 变量进行维度压缩,去除维数为 1 的的维度 torch.unsqueeze() 是 squeeze()的反向操作,增加一个维度,可以指定添加的维度 torch.stack(sequence, dim=0, out=None),做 tensor 的拼接

2.

另外一个较为重要的模块是 torch.nn 模块,其中含有一个包含大量计算方法的 nn.functional 和全部层需要定义的 nn.Module。该模块中的函数大量应用于神经网络的构建中,一些常用函数如下所示: torch.nn.Linear() # 线性层

torch.nn.MSELoss() # 均方差损失函数(回归用) torch.nn.CrossEntropyLoss() # # 交叉熵损失函数(分类用)

torch.optim.SGD(net.parameters(), lr=0.2) # SGD 优化器 torch.nn.functional.relu # 一个激活函数,所以在 functional 中而不是作为 torch.nn.的一个层

3.

另外,PyTorch 提供了 torchvision。它是一个视觉工具包,提供了很多视觉图像处理的工具,其中 transforms 模块提供了对 PIL Image 对象和 Tensor 对象的常用操作。对 PIL Image 的操作包括:(1)Scale:调整图片尺寸,长宽比保持不变;(2)enterCrop、RandomCrop、 RandomResizedCrop:裁剪图片;(3)Pad:填充;(4)ToTensor:将 PIL Image 对象转成 Tensor,会自动将[0, 255]归一化至[0, 1]。对 Tensor 的操作包括:(1)Normalize:标准化,即减均值,除以标准差;(2)ToPILImage:将 Tensor 转为 PIL Image 对象。

torchvision 主要包含三部分:(1)models:提供深度学习中各种经典网络的网络结构

以及预训练好的模型,包括 AlexNetVGG 系列、ResNet 系列、Inception 系列等;(2datasets:提供常用的数据集加载,设计上都是继承 torhc.utils.data.Dataset,主要包括 MNISTCIFAR10/100ImageNetCOCO 等;(3transforms:提供常用的数据预处理操作,主要包括对 Tensor 以及 PIL Image 对象的操作。

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值