百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python的矩阵传播机制&矩阵运算——消灭for循环

off999 2024-10-14 12:14 42 浏览 0 评论

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:\n",A)
print("\nA*2:\n",A*2) # 直接用A乘以2
print("\nA+10:\n",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("\nB:\n",B)
print("\nA+B:\n",A+B) 
print("\nA*B:\n",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<0
y’ = 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 = 0for 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,即“向量化”,以便让计算机进行矩阵运算。

相关推荐

k歌软件下载(屁颠虫k歌软件下载)
k歌软件下载(屁颠虫k歌软件下载)

这个简单,直接在“应用市场”软件搜索“全民K歌”就能找到这款APP,然后下载安装就可以了在你的手机搜索全民K歌这个软件下载就可以了!可以在应用宝里面下载这个软件的你可以直接点击上方的搜索框按钮然后在里面搜下想要找的软件或者游戏类型,然后点击...

2026-01-23 11:15 off999

微信android平板版(安卓市场(平板版))

华为平板没有微信是因为美国政府禁令导致谷歌取消对华为的服务支持,包括谷歌应用商店和谷歌服务框架。微信是谷歌服务框架下的应用程序,华为平板无法正常访问谷歌服务框架,因此也无法使用微信。另外,华为也推出了...

手机迅雷ios老版本直装(手机迅雷ios旧版下载beta)

IOS用很多软件都能替代迅雷,就算迅雷不能使用的话,也可以使用其他的软件来代替,软件的种类也是非常多的。可以先下载一个第三方助手,然后尝试一下能不能把迅雷下载下来,大多数情况下,下载一个第三方助手就可...

可以和虚拟人物聊天的软件(可以和虚拟人物聊天的软件,用QQ直接登陆)

在火星App中与多个虚拟人物对话,其实是一个相当有趣且简单的体验。首先,你需要确保已经下载并安装了火星App,并打开它。接着,在App的界面中,你可以找到虚拟人物的选项。点击进去后,你会看到多个虚拟人...

三年片在线观看免费大全电影

第一位:极限影音这是中国第一家免费电影网站。虽然域名有点难记,但它在很多免费电影网站上都有很好的服务。这是个好名声。你可以在这里得到最快和最新的免费电影。第二位:007免费在线电影这个网站是一个很好的...

旧版qq(旧版qq豌豆荚)

手机QQ软件好多更新都不好用,可能是刚开始不稳定。建议用回旧版本先。你可以打开QQ主页,然后按软件QQ下载,里面有个链接是旧版本下载的,点开下载你以前的版本就可以了    一、检查qq版本是否过于陈旧...

湖南卫视直播在线观看高清电视台

1.解锁手机,找到桌面上的央视频APP,打开。2.进入主页面后,点击页面底部的“电视”选项。3.进入电视页面后,默认显示的是CCTV的频道,上方切换到“卫视”频道。4.在打开的卫视图标中我们就...

rar解压软件官网(rar解压器官方免费下载)
rar解压软件官网(rar解压器官方免费下载)

winrar是解压软件。你没有安装winrar,所以打不开用winrar加压的软件。在网上下载个安装后就能用了。去安装解压软件啊,网上到处都有,直接在网上搜索就可以,软件下好后安装,将其设置在右键中,以后右键单击就可以解压相应winrar文...

2026-01-23 09:43 off999

音频编辑转换器(音频编辑转换器怎么用)

高转低音频转换器接法是指将一种信号转换成另一种信号的装置。信号是信息存在的形式或载体。在自动化仪表设备和自动控制系统中,常将一种信号转换成另一种与标准量或参考量比较后的信号,以便将两类仪表联接起来,因...

安卓游戏中心下载安装(安卓游戏中心app)

格来云游戏、Nibiru游戏城、快游戏、蟋蟀游戏大厅、石头游戏。以上app资源丰富,且支持外设连接,更新及时。1、格来云游戏:格来云游戏是动视云科技开发的APP,格来云不依赖玩家的电脑性能和储存,连...

正当防卫3手游下载(正当防卫三正版下载)

通过QQ浏览器,或者应用商店下载即可。华为手机上下载《正当防卫4》(JustCause4)的方法如下:方法一:使用华为应用市场(华为AppGallery)1.打开华为应用市场。2.在搜索框中输...

可以免费下载所有歌曲的网站

一、http://51Ape.Com一个免费提供无损音乐下载的网站,专注于Ape音乐、Flac音乐以及Wav等各类高品质无损音乐的免费下载,是目前国内比较好的免费音乐下载网站。二、91听歌网提供无损音...

龙珠斗士z手游版下载(龙珠斗士z手游版下载ios)

召唤神龙,实现愿望。龙珠z斗士中只要集齐七颗龙珠就可以召唤出神龙,来实现自己的愿望。在漫画动画各类手游中都是这样首先进入游戏主界面,点击“斗士”按钮进入选角界面,在选角界面中选择你要使用的角色并确认...

可以手动插人物的游戏手游(可以手动插人物的游戏手游app)

在手游对局中,左上角有一个开关,可切换手动开火和自动开火,切换到自动开火后,准星描到敌方人物即会自动开火。当然,并不是所有模式中都有自动开火开关,是特定的一些模式有该开关,比如挑战模式、刀战模式等。另...

手机铃声最好听的歌(手机铃声最好听的歌曲有哪些)

Everythingisnotwhatitseems超喜欢这首的,绝对不会撞见跟你铃声一样的Push艾薇儿的新歌,很好听,也很适合做铃声Foreverandalways钢琴版副歌部分很好听布兰妮的3也...

取消回复欢迎 发表评论: