0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python的矩阵传播机制

Linux爱好者 来源:SimpleAI 作者:Beyond 2021-09-30 16:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、Python的矩阵传播机制(Broadcasting)

我们知道在深度学习中经常要操作各种矩阵(matrix)。

回想一下,我们在操作数组(list)的时候,经常习惯于用**for循环(for-loop)**来对数组的每一个元素进行操作。例如:

my_list = [1,2,3,4]

new_list = []

for each in my_list:

new_list.append(each*2)

print(new_list) # 输出 [2,3,4,5]

如果是矩阵呢:

my_matrix = [[1,2,3,4],

[5,6,7,8]]

new_matrix = [[],[]]

for i in range(2):

for j in range(4):

new_matrix[i].append(my_matrix[i][j]*2)

print(new_matrix)# 输出 [[2, 4, 6, 8], [10, 12, 14, 16]]

实际上,上面的做法是十分的低效的!数据量小的话还不明显,如果数据量大了,尤其是深度学习中我们处理的矩阵往往巨大,那用for循环去跑一个矩阵,可能要你几个小时甚至几天。

Python考虑到了这一点,这也是本文主要想介绍的**“Python的broadcasting”即传播机制**。

先说一句,python中定义矩阵、处理矩阵,我们一般都用numpy这个库。

二、下面展示什么是python的传播机制

import numpy as np# 先定义一个3×3矩阵 A:

A = np.array(

[[1,2,3],

[4,5,6],

[7,8,9]])

print(“A:

”,A)

print(“

A*2:

”,A*2) # 直接用A乘以2print(“

A+10:

”,A+10) # 直接用A加上10

运行结果:

A:

[[1 2 3]

[4 5 6]

[7 8 9]]

A*2:

[[ 2 4 6]

[ 8 10 12]

[14 16 18]]

A+10:

[[11 12 13]

[14 15 16]

[17 18 19]]

接着,再看看矩阵×(+)矩阵:

#定义一个3×1矩阵(此时也可叫向量了)

B = np.array([[10],

[100],

[1000]])

print(“

B:

”,B)

print(“

A+B:

”,A+B)

print(“

A*B:

”,A*B)

运行结果:

B:

[[ 10]

[ 100]

[1000]]

A+B:

[[ 11 12 13]

[ 104 105 106]

[1007 1008 1009]]

A*B:

[[ 10 20 30]

[ 400 500 600]

[7000 8000 9000]]

可见,虽然A和B的形状不一样,一个是3×3,一个是3×1,但是我们在python中可以直接相加、相乘,相减相除也可以。

也许看到这,大家都对broadcasting有感觉了。

用一个图来示意一下:

所谓“传播”,就是把一个数或者一个向量进行“复制”,从而作用到矩阵的每一个元素上。

有了这种机制,那进行向量和矩阵的运算,就太方便了!理解了传播机制,就可以随心所欲地对矩阵进行各种便捷的操作了。

利用numpy的内置函数对矩阵进行操作:

numpy内置了很多的数学函数,例如np.log(),np.abs(),np.maximum()等等上百种。直接把矩阵丢进去,就可以算出新矩阵!示例:

print(np.log(A))

输出把A矩阵每一个元素求log后得到的新矩阵:

array([[0. , 0.69314718, 1.09861229],

[1.38629436, 1.60943791, 1.79175947],

[1.94591015, 2.07944154, 2.19722458]])

再比如深度学习中常用的ReLU激活函数,就是y=max(0,x),

也可以对矩阵直接运算:

X = np.array([[1,-2,3,-4], [-9,4,5,6]])Y = np.maximum(0,X)print(Y)

得到:

[[1 0 3 0] [0 4 5 6]]

更多的numpy数学函数,可以参见文档:https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.math.html

三、定义自己的函数来处理矩阵

其实这才是我写下本文的目的。。。前面扯了这么多,只是做个铺垫(/ω\)

我昨天遇到个问题,就是我要对ReLU函数求导,易知,y=max(0,x)的导函数是:y’ = 0 if x《0y’ = 1 if x》0但是这个y’(x)numpy里面没有定义,需要自己构建。即,我需要将矩阵X中的小于0的元素变为0,大于0的元素变为1。搞了好久没弄出来,后来在StackOverflow上看到了解决办法:

def relu_derivative(x):

x[x《0] = 0

x[x》0] = 1

return x

X = np.array([[1,-2,3,-4],

[-9,4,5,6]])

print(relu_derivative(X))

输出:

[[1 0 1 0]

[0 1 1 1]]

**居然这么简洁就出来了!!!**ミ゚Д゚彡 (゚Д゚#)

这个函数relu_derivative中最难以理解的地方,就是**x[x》0]**了。于是我试了一下:

X = np.array([[1,-2,3,-4],

[-9,4,5,6]])

print(X[X》0])

print(X[X《0])

输出:

[1 3 4 5 6]

[-2 -4 -9]

它直接把矩阵X中满足条件的元素取了出来!原来python对矩阵还有这种操作!

震惊了我好久~

所以可以这么理解,X[X》0]相当于一个“选择器”,把满足条件的元素选出来,然后直接全部赋值。

用这种方法,我们便可以定义各种各样我们需要的函数,然后对矩阵整体进行更新操作了!

四、综上

可以看出,python以及numpy对矩阵的操作简直神乎其神,方便快捷又实惠。其实上面忘了写一点,那就是计算机进行矩阵运算的效率要远远高于用for-loop来运算,

不信可以用跑一跑:

# vetorization vs for loop# define two arrays a, b:

a = np.random.rand(1000000)

b = np.random.rand(1000000)

# for loop version:

t1 = time.time()

c = 0

for i in range(1000000):

c += a[i]*b[i]

t2 = time.time()

print(c)

print(“for loop version:”+str(1000*(t2-t1))+“ms”)

time1 = 1000*(t2-t1)

# vectorization version:

t1 = time.time()

c = np.dot(a,b)

t2 = time.time()

print(c)

print(“vectorization version:”+str(1000*(t2-t1))+“ms”)

time2 = 1000*(t2-t1)

print(“vectorization is faster than for loop by ”+str(time1/time2)+“ times!”)

运行结果:

249765.8415288075

for loop version:627.4442672729492ms

249765.84152880745

vectorization version:1.5032291412353516ms

vectorization is faster than for loop by 417.39762093576525 times!

可见,用for方法和向量化方法,计算结果是一样,但是后者比前者快了400多倍!

因此,在计算量很大的时候,我们要尽可能想办法对数据进行Vectorizing,即“向量化”,以便让计算机进行矩阵运算。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • for
    for
    +关注

    关注

    0

    文章

    44

    浏览量

    16323
  • python
    +关注

    关注

    59

    文章

    4892

    浏览量

    90422
  • 深度学习
    +关注

    关注

    73

    文章

    5614

    浏览量

    124751

原文标题:消灭 for 循环!Python 的矩阵传播机制和矩阵运算

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Python AI 数字化实战:从 Pandas 自动化到 DeepSeek “星逻系统”开发,无密

    不仅极易引入人为错误,更是对脑力资源的巨大浪费。Python生态中的Pandas库,正是打破这一僵局的终极武器。然而,真正告别低效,绝非掌握几条生硬的指令那么简单,而是需要从技术底层逻辑出发,完成从
    发表于 04-30 13:43

    使用PYTHON进行的跨平台仿真

    如何使用编程语言Python来调用和控制VirtualLab Fusion中的模拟。请查看下面链接的文档,以找到关于如何设置和使用Python和VirtualLab Fusion之间的接口的详细指南,以及一个
    发表于 04-02 08:21

    [VirtualLab] 使用Python运行VirtualLab Fusion光学仿真

    摘要 VirtualLab Fusion允许Python外部访问其建模技术、求解器和结果。这个用例介绍了一种使用路径变量和Visual Studio代码将Python连接到VirtualLab
    发表于 03-31 09:39

    [VirtualLab] 使用Python进行跨平台参数扫描

    摘要 VirtualLab Fusion允许外部访问其建模技术、求解器和结果。这有助于应用其他数据处理或优化工具来进一步研究光学模拟。在本示例中,我们演示如何使用Python脚本运行参数扫描,以及
    发表于 03-31 09:36

    如何在 VisionFive 上使用 Python 包?

    VisionFive Fedora 下的本地目录,请在源代码目录下执行以下命令: 提示:源代码可从以下位置下载:愿景五.gpio. sudo yum install python
    发表于 03-30 08:28

    算法工程师需要具备哪些技能?

    、链式法则等。应用场景:梯度下降优化算法、反向传播计算等。 优化理论核心内容:凸优化、非凸优化、拉格朗日乘数法等。应用场景:模型参数调优、资源分配问题等。 编程语言Python:主流选择,用于数据处理、模型
    发表于 02-27 10:53

    高格欣科技液晶广告机:全场景智能显示,赋能商业传播新体验

    行业提供高效的视觉传播解决方案。全尺寸矩阵覆盖,精准适配不同空间需求。【高格欣】液晶广告机提供从15.6寸到110寸的全尺寸选择,兼顾精致空间与大型场馆的差异化需求
    的头像 发表于 01-13 16:57 781次阅读
    高格欣科技液晶广告机:全场景智能显示,赋能商业<b class='flag-5'>传播</b>新体验

    没有专利的opencv-python 版本

    所有 官方发布的 opencv-python 核心版本(无 contrib 扩展)都无专利风险——专利问题仅存在于 opencv-contrib-python 扩展模块中的少数算法(如早期 SIFT
    发表于 12-13 12:37

    高清混合矩阵 vs 传统矩阵:别再瞎选!3 大核心差异 + 行业选型攻略,选错可能亏大了

    在数字化视听系统快速发展的当下,矩阵切换器作为信号传输与调度的 “核心枢纽”,其性能差异直接影响着视听体验的质量与系统运行的稳定性。目前市场上主流的矩阵切换器主要分为 “高清混合矩阵切换器
    的头像 发表于 11-12 10:42 751次阅读
    高清混合<b class='flag-5'>矩阵</b> vs 传统<b class='flag-5'>矩阵</b>:别再瞎选!3 大核心差异 + 行业选型攻略,选错可能亏大了

    中兴通讯斩获ESG年度传播影响力先锋奖

    近日,在“2025零碳使命国际气候峰会暨绿色发展年度致敬典礼”上,中兴通讯凭借在环境、社会与公司治理(ESG)领域的卓越实践及全球传播影响力,荣获凤凰卫视“ESG年度传播影响力先锋”奖。这一殊荣不仅充分肯定了中兴通讯的可持续发展战略和
    的头像 发表于 10-29 15:10 1021次阅读

    termux如何搭建python游戏

    termux如何搭建python游戏 Termux搭建Python游戏开发环境的完整指南 一、Termux基础环境准备 Termux是一款无需root即可在安卓设备上运行的Linux终端
    发表于 08-29 07:06

    python app不能运行怎么解决?

    ;python_agent[1241]: xmlrpc request method supervisor.stopProcess failed;python_agent[1241]: xmlrpc request method supervisor.stopProces
    发表于 08-06 06:27

    软通动力斩获年度企业公关传播案例奖

    近日,在2025第十三届TopDigital创新营销盛典上,凭借在公关传播领域的卓越实践与创新突破,软通动力从数百家参评企业中脱颖而出,斩获“年度企业公关传播案例”奖,成为本年度数字经济服务领域品牌建设的标杆典范。
    的头像 发表于 07-22 16:59 1117次阅读

    CAN总线传播延迟过大导致通信异常现象解析

    应答信号,影响数据传输确认机制;也可能会引发数据采样错误,导致发送与接收位不一致,产生位错误。本文将在不考虑其它影响下,对传播延迟过大造成的应答错误现象进行详细解析。相
    的头像 发表于 07-15 11:47 1239次阅读
    CAN总线<b class='flag-5'>传播</b>延迟过大导致通信异常现象解析

    信号如何在PCB中传播

    为电磁兼容性(EMC)设计印刷电路板(PCB)时,需要从电磁场和电流的角度深入理解信号传播。这些概念之所以重要,是因为它们帮助我们设计出电磁场辐射低、对外部辐射或干扰敏感度低的 PCB。
    的头像 发表于 06-09 16:08 5255次阅读
    信号如何在PCB中<b class='flag-5'>传播</b>