当前位置: 首页 > ai >正文

Numpy基础(通用函数)

通用函数

Numpy提供了两种基本的对象,即ndarray和ufunc对象。前文已经介绍了ndarray,本
节将介绍Numpy的另一个对象通用函数(ufunc)。ufunc是universal function的缩写,它是
一种能对数组的每个元素进行操作的函数。许多ufunc函数都是用C语言级别实现的,因此
它们的计算速度非常快。此外,它们比math模块中的函数更灵活。math模块的输入一般是
标量,但Numpy中的函数可以是向量或矩阵,而利用向量或矩阵可以避免使用循环语句,
这点在机器学习、深度学习中非常重要。表1-5为Numpy中常用的几个通用函数。

函数使用方法
sqrt计算序列化数据的平方根
sin,cos三角函数
abs计算序列化数据的绝对值
dot矩阵运算
log,log10,log2对数函数
exp指数函数
cumsum,cumproduct累计求和、求积
sum对一个序列化数据进行求和
mean计算均值
median计算中位数
std计算标谁差
var计数方差
corrcoef计算相关系数

1.math与numpy函数的性能比较

import time
import math
import numpy as np# 修复:使用 time.perf_counter()  替代已移除的 time.clock()
x = [i * 0.001 for i in np.arange(1000000)]start = time.perf_counter()  # 修正点1
for i, t in enumerate(x):x[i] = math.sin(t)
print("math.sin:", time.perf_counter() - start)  # 修正点2x = np.array([i * 0.001 for i in np.arange(1000000)])  # 优化:直接生成数组start = time.perf_counter()  # 修正点3
np.sin(x)  # 向量化计算
print("numpy.sin:", time.perf_counter() - start)  # 修正点4

运行结果

math.sin: 0.26994549995288253
numpy.sin: 0.011595400050282478

由此可见,numpy.sin比math.sin快近10倍。

2.循环与向量运算比较

充分使用Python的Numpy库中的内建函数(Built-in Function),来实现计算的向量
化,可大大地提高运行速度。Numpy库中的内建函数使用了SIMD指令。如下使用的向量
化要比使用循环计算速度快得多。如果使用GPU,其性能将更强大,不过Numpy不支持
GPU。PyTorch支持GPU,后面第5章将介绍PyTorch如何使用GPU来加速算法。

import time
import numpy as npx1=np.random.rand(1000000)
x2=np.random.rand(1000000)
##使用循环计算向量点积
tic=time.process_time()
dot=0
for i in range(len(x1)):dot+=x1[i]*x2[i]
toc=time.process_time()
print("dot = "+str(dot)+"\nfor loop ------ Computation time=" +str(1000*(toc-tic))+"ms")
##使用numpy函数求点积
tic=time.process_time()
dot=0
dot=np.dot(x1,x2)
toc=time.process_time()
print("dot ="+str(dot)+"\n vertor version ----- Computation time=" +str(1000*(toc-tic))+"ms")

运行结果

dot = 250103.418572677
for loop ------ Computation time=546.875ms
dot =250103.4185726741vertor version ----- Computation time=31.25ms

从运行结果上来看,使用for循环的运行时间大约是向量运算的400倍。因此,在深度
学习算法中,一般都使用向量化矩阵进行运算。

http://www.xdnf.cn/news/17375.html

相关文章:

  • [IOMMU]基于 AMD IOMMU(AMD‑Vi/IOMMUv2)的系统化总结与落地方案
  • 【C++】模版进阶
  • FMS 2025存储峰会获奖技术全景解读
  • C/C++基础详解(二)
  • AcWing 4579. 相遇问题
  • Day38 Dataset和Dataloader类
  • Datawhale AI夏令营-记录2
  • NVIDIA Jetson实战笔记
  • 【c++】探秘Loop机制:C++中优雅的双向数据交互模式
  • 力扣 hot100 Day70
  • 【Python 高频 API 速学 ⑥】
  • CrystalDiskInfo 9.0.1 安装教程 - 硬盘检测工具下载安装步骤详解
  • 基于迁移学习的伺服电机轴承故障诊断
  • Python变量引用拷贝
  • 求和算法的向后稳定性 backward stable
  • 大模型“涌现”背后的暗线——规模、数据、目标函数的三重协奏
  • Spring 的原理探究
  • 服务器硬件电路设计之I2C问答(二):I2C总线的传输速率与上拉电阻有什么关系?
  • vs2022编译Activemq
  • 创建一个django项目
  • 【js】判断异步函数的返回值要加await
  • 大语言模型提示工程与应用:大语言模型对抗性提示安全防御指南
  • springboot 2.4跨域变化和swagger结合的问题
  • orcad的操作(1)
  • BGP笔记
  • 微积分 | 外微分
  • vue+flask山西非遗文化遗产图谱可视化系统
  • 通过 SCP 和 LXD 配置迁移 CUDA 环境至共享(笔记)
  • AI编程工具 | Trae介绍
  • 智能的本质