Numpy从入门到精通——详解广播机制

news2024/12/27 13:02:35

这个专栏名为《Numpy从入门到精通》,顾名思义,是记录自己学习numpy的学习过程,也方便自己之后复盘!为深度学习的进一步学习奠定基础!希望能给大家带来帮助,爱睡觉的咋祝您生活愉快! 这一篇介绍《Numpy从入门到精通——广播机制

在这里插入图片描述

文章目录

  • 一、np与math库比较
  • 二、与单一元素进行运算
  • 三、循环与向量运算比较

一、np与math库比较

使用过python的同学相信对math都不陌生,在我很早的博客中也提及到math库的使用,具体可以看链接链接: 八种方法求π的近似值,

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_11.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/17 22:09 
"""
import time
import math
import numpy as np

x = [i * 0.001 for i in np.arange(1000000)]
start = time.time()
for i, t in enumerate(x):
    x[i] = math.sin(t)
print("math.sin:", time.time() - start)

x = [i * 0.001 for i in np.arange(1000000)]
x = np.array(x)
start = time.time()
np.sin(x)
print("numpy.sin:", time.time() - start)

输出:
在这里插入图片描述
可以看到np的速度是math的进50倍。
下面再看一个例子:

def basic_sigmoid(x):定义basich_sigmoid函数,需要一个参数x
    """
    Compute sigmoid of x.

    Arguments:
    x -- A scalar

    Return:
    s -- sigmoid(x)
    """

    ### START CODE HERE ### (≈ 1 line of code)
    s = 1.0 / (1.0 + 1.0 / math.exp(x))  math.exp(x) 相当于自然系数e的x次方
上一行写成公式就是s=1/(1+e^x )
    ### END CODE HERE ###

    return s返回s

basic_sigmoid(3) 调用上面定义的函数





x = np.linspace(-5,5,1000)-55生成1000个数
y = []   定义一个列表
for i in range(1000):  循环
    y.append(basic_sigmoid(x[i]))   调用上面的函数,传入一个数字,即可通过函数生成一个值,将生成值添加到列表上
    
plt.plot(x,y,c="r") 通过一系列(x,y),用plt将图画出来,

画出来的图如图一:
在这里插入图片描述

### One reason why we use "numpy" instead of "math" in Deep Learning ###
x = [1, 2, 3]
basic_sigmoid(x) # you will see this give an error when you run it, because x is a vector.传入的是列表会报错,之前定义的函数需要出人的是具体的数值,所以传入一个列表会报错

import numpy as np 导入numpy模块

# example of np.exp
x = np.array([1, 2, 3])  创建一个numpy矩阵,值为1,2,3
print(np.exp(x)) # result is (exp(1), exp(2), exp(3))   将numpy矩阵传入进去,发现可以正常运行,结果为[ 2.71828183  7.3890561  20.08553692]



# example of vector operation
x = np.array([1, 2, 3])
print (x + 3)  numpy矩阵整体+1,结果为np.array([4 5 6])



# GRADED FUNCTION: sigmoid

import numpy as np # this means you can access numpy functions by writing np.function() instead of numpy.function()  给numpy取了个别名np,减少了代码量

def sigmoid(x):
    """
    Compute the sigmoid of x

    Arguments:
    x -- A scalar or numpy array of any size

    Return:
    s -- sigmoid(x)
    """
    
    ### START CODE HERE ### (≈ 1 line of code)
    s = 1.0 / (1.0 + np.exp(-1.0 * x))  和上面相同,np.exp也是e的x次方,写成公式为:
s=1/(1+e^(-x) )
    ### END CODE HERE ###
    
    return s返回s的值

x = np.array([1, 2, 3])  创建numpy矩阵
sigmoid(x) 直接调用定义好的函数,不再需要for循环
x = np.linspace(-15,15,1000) 同上,创建-15151000个数值
y = sigmoid(x) 将返回结果给y

plt.plot(x,y,c="r") plt绘图
plt.show() 展示图片

图片如下:
在这里插入图片描述

总结:通过这个小案例,我们知道了numpy矩阵可以直接运算,这正是深度学习使用numpy库而非math库的原因,在深度学习中,有大量矩阵的相关运算,使用numpy可以提升运算的速度并减少代码量,numpy是一个很好用的科学计算库!

二、与单一元素进行运算

利用numpy的广播机制,可以将np矩阵与单一元素直接进行运算,我们直接看代码示例:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_12.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/17 22:23 
"""
import numpy as np
A = np.array([[1, 2], [-1, 4]])
print("+运算:")
print(A+1)
print("-运算:")
print(A-1)
print("*运算:")
print(A*2)
print("除整数运算:")
print(A/2)
print("除小数运算:")
print(A/2.0)

输出:

+运算:
[[2 3]
 [0 5]]
-运算:
[[ 0  1]
 [-2  3]]
*运算:
[[ 2  4]
 [-2  8]]
除整数运算:
[[ 0.5  1. ]
 [-0.5  2. ]]
除小数运算:
[[ 0.5  1. ]
 [-0.5  2. ]]

三、循环与向量运算比较

由于numpy具有广播机制的特性,使得ndarray能够不借助for循环直接运行,速度大大提升,但值得注意的是numpy不支持GPU运算:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_13.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/17 22:32 
"""
import time
import numpy as np
x1 = 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) + "\n for 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 verctor version---- Computation time = " + str(1000 * (toc - tic)) + "ms")

输出:

dot = 249929.02170318714
 for loop----- Computation time = 187.5ms
dot = 249929.0217031858
 verctor version---- Computation time = 15.625ms

for循环的时间是向量运算的400倍,这也再次证明了深度学习算法中一般都用向量化的矩阵运算!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/466604.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习-线性模型(波士顿房价预测)

机器学习-线性模型(波士顿房价预测) 文章目录 机器学习-线性模型(波士顿房价预测)人工智能、机器学习、深度学习的关系机器学习深度学习 波士顿房价预测数据集介绍模型假设 → \rightarrow →线性回归模型评价函数 → \rightarrow →均方误差线性回归模型网络结构实现波士顿房价…

HummerRisk V1.0 安装部署指南

HummerRisk v1.0 开始采用 springcloud 微服务架构,微服务架构更加易于扩展、易于容错、灵活部署,但是需要注意的是 HummerRisk v0.x 版本无法直接升级到 v1.0,如需使用 HummerRisk 请手动安装最新版本。 环境要求 全新安装的 Linux(x64)需要…

HashMap详解

手撕HashMap源码 HashMap一直是面试的重点。今天我们来了解了解它的源码吧! 首先看一下Map的继承结构图 源码分析 什么是哈希 **Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算…

【Python语法系列】第三章:Python判断语句

进行逻辑判断,是生活中常见的行为。同样,在程序中,进行逻辑判断也是最为基础的功能,一个逻辑判断的流程非常简单,我们有一个判断的条件,那么他无非给我们返回两个结果,是或者否,是的…

Ubuntu22.04部署Pytorch2.0深度学习环境

文章目录 安装Anaconda创建新环境安装Pytorch2.0安装VS CodeUbuntu下实时查看GPU状态的方法小实验:Ubuntu、Windows10下GPU训练速度对比 Ubuntu安装完显卡驱动、CUDA和cudnn后,下面部署深度学习环境。 (安装Ubuntu系统、显卡驱动、CUDA和cudn…

成本降低33%!英飞凌挑战智能汽车「高功率密度」瓶颈

伴随着汽车电动化、智能化的逐步推进,功率半导体器件的需求激增。其中,MOSFET作为新能源汽车中DC-DC、OBC等电源系统的重要组成部分,应用于汽车动力域以完成电能的转换与传输。同时,MOSFET还是可以用于ADAS、安全、信息娱乐等功能…

华为流程体系:MPP流程

今天主要来讲讲IPD中营销侧的另一个流程:MPP 流程。 在讲解MTL流程时,提到过MTL流程的底层逻辑是4C营销理论。 换句话说就是,MTL 流程是面向客户的产品上市流程。 而MPP流程则是面向产品的上市流程,它的底层逻辑就是经典的4P营…

新工具、新升级,推陈出新的测试好帮手

前言 【推陈出新】才是我们搞IT的正确发展方向,我们要以发展的眼光来看待我们使用的测试工具,如何升级您手中的测试工具,我们来品一品Eoink的Apikit五个维度对比我们之前用的测试工具? 我会按照:基础功能全面与否、大型…

Golang每日一练(leetDay0048) 链表专题

目录 141. 环形链表 Linked List Cycle 🌟 142. 环形链表 II Linked List Cycle II 🌟🌟 143. 重排链表 Reorder List 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一…

全光谱防蓝光护眼灯有用吗?怎么分辨是全光谱灯

每个人的家里都有一两个台灯,孩子用来学习,老人用来阅读。但台灯不仅仅是用来照明而已,还需要呵护我们的双眼。现在的孩子患近视的人越来越多,很多小学生都戴上了眼镜,而老年人老花眼白内障的患者也在攀升,…

华三(H3C)GRE OVER IPsec实验

实验拓扑 目录 实验需求 1. 某企业北京总部、上海分支、武汉分支分别通过 R1,R3,R4 接入互联网,配置默认路由连通公网 2. 按照图示配置 IP 地址,R1,R3,R4 分别配置 Loopback0 口匹配感兴趣流&#xff0…

电子行业数字工厂管理系统有哪些优点和不足

随着制造业的不断发展,其生产技术也在不断改进,有许多电子企业都在部署数字工厂管理系统,进行数字化转型。如果不了解数字工厂管理系统,盲目部署的话,容易走很多弯路。本文将跟大家探讨一下,电子行业数字工…

本地Linux服务器安装宝塔面板,并公网远程登录

文章目录 前言1. 安装宝塔2. 安装cpolar内网穿透3. 远程访问宝塔4. 固定http地址5. 配置二级子域名6. 测试访问二级子域名 前言 宝塔面板作为建站运维工具,它支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能,可提高运维效率。…

云原生|Packer插件开发在项目中应用

作者:李冠军 神州数码云基地 高级后端开发工程师 云时代我们可以在各云厂商控制台点一点,实例就生成了,但是这个点还是需要自己去点,如果把这些动作写成代码,直接运行,一切就完成了。 这就是Packer的作用…

使用Markdown编辑器

使用Markdown编辑器 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注…

总结833

学习目标: 4月(复习完高数18讲内容,背诵21篇短文,熟词僻义300词基础词) 学习内容: 暴力英语:背《美丽心灵》,背《大独裁者》五六段,六百四十字的文章,明天加…

Java中的序列化与反序列化

序列化和反序列化作为 Java 里一个较为基础的知识点,但我相信很多人能了解的也就是那么几句而已,甚至都不了解,如果再深究问一下 Java 如何实现序列化和反序列化的,就可能不知所措了! 不知道怎么说好,什么是…

GD(兆易创新)系列FLASH进行FPGA和ZYNQ配置固化相关操作

写在前面 本文主要针对使用GD(兆易创新)系列的FLASH做启动配置片时,遇到的相关问题进行简单整理复盘,避免后人踩坑。 本人操作固化芯片型号为:ZYNQ7045、690T(复旦微替代型号V7 690T)。 7系列…

为类创建事务码,读取EXCEL并显示报表简单版

屏幕以及字段定义 DATA: go_container TYPE REF TO cl_gui_custom_container. DATA: lv_subrc TYPE i,gv_action TYPE int4,lt_filetab TYPE filetable,ls_filetab TYPE file_table.DATA: gv_exit TYPE flag . DATA: lt_input TYPE TABLE OF alsmex_tabline,…

人脸识别概述

博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的&#xff0c…