最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中的Broadcast機(jī)制

 更新時(shí)間:2023年06月14日 09:15:51   作者:Hayz  
這篇文章主要介紹了Python中的Broadcast機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Python Broadcast機(jī)制

最近在用numpy的時(shí)候,里面的矩陣和向量之間各種乘法加法搞的我頭昏腦脹,整理下總結(jié)出來(lái)的規(guī)則

首先說(shuō)明array型數(shù)據(jù)結(jié)構(gòu)有兩種類(lèi)型,一種是一維的向量,比如用np.linspace(1,2,num=2)創(chuàng)建出的對(duì)象,shape為(2,);另外一種就是多維的矩陣,如np.zeros(1,2)創(chuàng)建出的對(duì)象,其shape為(1,2),這兩種類(lèi)型是不一樣的。

矩陣之間的矩陣乘法

不必多說(shuō),就是按照正常的矩陣乘法規(guī)則來(lái)做

(N,M) (M,P) = (N,P)

矩陣之間按元素相乘、相加

這里開(kāi)始就涉及到廣播(broadcast)的問(wèn)題了。

其實(shí)也比較簡(jiǎn)單,兩個(gè)矩陣broadcast后的結(jié)果每一維都是兩個(gè)矩陣中最大的。

但broadcast必須滿(mǎn)足兩個(gè)規(guī)則,即要么相對(duì)應(yīng)的維數(shù)相等,要么其中有一個(gè)矩陣的維數(shù)是1。

那么問(wèn)題來(lái)了,哪兩個(gè)維度是相對(duì)應(yīng)的維數(shù)呢?規(guī)則就是將矩陣的shape寫(xiě)出來(lái),然后按右對(duì)齊逐維對(duì)比。

通過(guò)以上方法,可以得出兩矩陣broadcast結(jié)果的維數(shù),而最后結(jié)果的計(jì)算方法就是先將兩個(gè)矩陣都broadcast到結(jié)果的維數(shù),然后再按照相同維度的矩陣對(duì)應(yīng)元素相乘、相加。

例子如下:

A ? ? ?(4d array): ?8 x 1 x 6 x 1
B ? ? ?(3d array): ? ? ?7 x 1 x 5
Result (4d array): ?8 x 7 x 6 x 5
A ? ? ?(2d array): ?5 x 4
B ? ? ?(1d array): ? ? ?1
Result (2d array): ?5 x 4
A ? ? ?(2d array): ?15 x 3 x 5
B ? ? ?(1d array): ?15 x 1 x 5
Result (2d array): ?15 x 3 x 5

矩陣和向量之間的矩陣乘法

這里也很簡(jiǎn)單,規(guī)則是

作左乘數(shù)的向量是行向量,作右乘數(shù)的向量是列向量。

這樣做的好處就是,結(jié)果矩陣一定也是個(gè)向量。這個(gè)規(guī)則也說(shuō)明了向量不一定是行向量(雖然print出來(lái)看見(jiàn)的是一個(gè)行向量)

矩陣和向量之間的按元素乘法、加法

規(guī)則其實(shí)和“二”中說(shuō)的是一樣的,只不過(guò)這里要注意的是,向量在這里永遠(yuǎn)當(dāng)作(1,N)來(lái)看,也就是是行向量,按照“二”中所說(shuō)的broadcast的規(guī)則,向量的維度永遠(yuǎn)從右對(duì)齊,也就是只有最右邊有數(shù),也就說(shuō)明和他進(jìn)行broadcast的矩陣,其最低維(也就是最右側(cè)的維度)要么是一維,要么就和向量的維度相同。

舉例子如下:

矩陣 (3d array) ? : 256 x 256 x 3
向量 (1d array) ? : ? ? ? ? ? ? 3
結(jié)果 (3d array) ? : 256 x 256 x 3

python broadcast機(jī)制的模擬實(shí)現(xiàn)

tensorflow的算術(shù)操作:mul/add/sub等op都支持broadcast機(jī)制,該機(jī)制支持不同維度的計(jì)算,但是在對(duì)維度進(jìn)行逆向比較時(shí)需要滿(mǎn)足以下要求:

  • 1)二者維度相同
  • 2)二者維度有一個(gè)為1
  • 3)如果維度大小不一致,需要用1來(lái)對(duì)維度小的數(shù)據(jù)進(jìn)行擴(kuò)展,在進(jìn)行上述判斷;

如:a:[256,256,3]、b:[3]這樣的維度,需要先將b擴(kuò)展至與a一致,將b擴(kuò)展至[1,1,3],再對(duì)a、b數(shù)據(jù)進(jìn)行mul/add/sub等計(jì)算,最后輸出維度[256,256,3]

如果為了實(shí)現(xiàn)broadcast,可以進(jìn)行以下操作進(jìn)行模擬:

  • 1)對(duì)維度大小不一致的數(shù)組進(jìn)行維度擴(kuò)展
  • 2)獲取輸出維度,即broadcast的維度
  • 3)進(jìn)行數(shù)據(jù)廣播

粗略代碼如下(這里以四維數(shù)據(jù)為例,進(jìn)行擴(kuò)展):

import tensorflow as tf
import numpy as np
if __name__ == "__main__":
	input0_shape = [1,1,3,1]
	input1_shape = [3]
	#維度擴(kuò)展
	input_len = len(input0_shape) - len(input1_shape)
	for i in range(input_len):
		input1_shape.insert(0,1)
	print input1_shape
	#獲取broadcast shape
	broadcast_shape = [0] * len(input0_shape)
	for i in range(len(input0_shape)):
		broadcast_shape[i] = max(input0_shape[i],input1_shape[i])
	print broadcast_shape
	data_a = np.random.random(input0_shape)	#hwcn
	data_b = np.random.random(input1_shape) #h,w,c_out,c_in
	a = tf.placeholder("float")
	b = tf.placeholder("float")
	c = tf.add(a,b)
	with tf.Session() as sess:
		sess.run(tf.global_variables_initializer())
		out = sess.run(c, feed_dict={a: data_a,b:data_b})
		#print data_a
		print data_b
		print out.shape
		#print out - data_a
	res_pre = out - data_b    	#獲取input0的擴(kuò)展結(jié)果,用于驗(yàn)證實(shí)際值
	out_tf = res_pre.reshape(broadcast_shape[0]*broadcast_shape[1]*broadcast_shape[2]*broadcast_shape[3])
	data_b_tmp = data_a.reshape(input0_shape[0]*input0_shape[1]*input0_shape[2]*input0_shape[3])
	print "out_tf"
	print out_tf
	f_dets = open("pre_data.dat", "w")
	for k in out_tf:
		b = float(k)
		a = '{:.10f}'.format(b)
		f_dets.write(str(a) + '\n')
	f_dets.close()
	out_res = [0]*broadcast_shape[0]*broadcast_shape[1]*broadcast_shape[2]*broadcast_shape[3]
	#進(jìn)行數(shù)據(jù)擴(kuò)展
	for i in range(broadcast_shape[0]):
		for j in range(broadcast_shape[1]):
			for k in range(broadcast_shape[2]):
				for m in range(broadcast_shape[3]):
					tmp_idx0 = i*broadcast_shape[1]*broadcast_shape[2]*broadcast_shape[3]  \
					          + j*broadcast_shape[2]*broadcast_shape[3] + k*broadcast_shape[3] + m
					ii = 0
					jj = 0
					kk = 0
					mm = 0
					if i >= input0_shape[0]:
						ii = input0_shape[0] -1
					else:
						ii = i
					if j >= input0_shape[1]:
						jj = input0_shape[1] -1
					else:
						jj = j
					if k >= input0_shape[2]:
						kk = input0_shape[2] -1
					else:
						kk = k
					if m >= input0_shape[3]:
						mm = input0_shape[3] -1
					else:
						mm = m
					tmp_idx1 = ii*input0_shape[1]*input0_shape[2]*input0_shape[3] \
								+ jj*input0_shape[2]*input0_shape[3] + kk*input0_shape[3] + mm
					#print mm
					out_res[tmp_idx0] = data_b_tmp[tmp_idx1]
	f_dets = open("aft_data.dat", "w")
	for k in out_res:
		b = float(k)
		a = '{:.10f}'.format(b)
		f_dets.write(str(a) + '\n')
	f_dets.close()
	#對(duì)比
	print "compare"
	print out_res - out_tf

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中的sorted函數(shù)應(yīng)用及文件操作詳解

    Python中的sorted函數(shù)應(yīng)用及文件操作詳解

    這篇文章主要介紹了Python中的sorted函數(shù)應(yīng)用及文件操作詳解,python只能將字符串寫(xiě)入到文本文件,要將數(shù)值數(shù)據(jù)存儲(chǔ)到文本本件中,必須先試用函數(shù)str()將其轉(zhuǎn)換為字符串格式,需要的朋友可以參考下
    2023-12-12
  • Python實(shí)現(xiàn)aes加密解密多種方法解析

    Python實(shí)現(xiàn)aes加密解密多種方法解析

    這篇文章主要介紹了Python實(shí)現(xiàn)aes加密解密多種方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python導(dǎo)入模塊的3種方式小結(jié)

    Python導(dǎo)入模塊的3種方式小結(jié)

    本文主要介紹了Python導(dǎo)入模塊的3種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Python語(yǔ)法學(xué)習(xí)之正則表達(dá)式的使用詳解

    Python語(yǔ)法學(xué)習(xí)之正則表達(dá)式的使用詳解

    要想成功的進(jìn)行字符串的匹配需要使用到正則表達(dá)式模塊,正則表達(dá)式匹配規(guī)則以及需要被匹配的字符串。本文詳細(xì)為大家介紹了如何利用正則表達(dá)式實(shí)現(xiàn)字符的匹配,感興趣的可以了解一下
    2022-04-04
  • python讀取TXT每行,并存到LIST中的方法

    python讀取TXT每行,并存到LIST中的方法

    今天小編就為大家分享一篇python讀取TXT每行,并存到LIST中的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Pygame Display顯示模塊的使用方法

    Pygame Display顯示模塊的使用方法

    本文主要介紹了Pygame Display顯示模塊的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5表單布局控件QFormLayout詳細(xì)使用方法與實(shí)例

    python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5表單布局控件QFormLayout詳細(xì)使用方法與實(shí)例

    這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5布局控件QFormLayout詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下
    2020-03-03
  • 如何使用Python讀取xml文件

    如何使用Python讀取xml文件

    這篇文章主要介紹了如何使用Python讀取xml文件,關(guān)于python讀取xml文章很多,但大多文章都是貼一個(gè)xml文件,然后再貼個(gè)處理文件的代碼希望這篇文章可以更通俗易懂的教如何使用python 來(lái)讀取xml 文件
    2023-04-04
  • 如何使用Python實(shí)現(xiàn)斐波那契數(shù)列

    如何使用Python實(shí)現(xiàn)斐波那契數(shù)列

    這篇文章主要介紹了如何使用Python實(shí)現(xiàn)斐波那契數(shù)列,斐波那契數(shù)列(Fibonacci)最早由印度數(shù)學(xué)家Gopala提出,而第一個(gè)真正研究斐波那契數(shù)列的是意大利數(shù)學(xué)家 Leonardo Fibonacci,需要的朋友可以參考下
    2019-07-07
  • python常見(jiàn)問(wèn)題之zsh:?command?not?found:?celery的解決

    python常見(jiàn)問(wèn)題之zsh:?command?not?found:?celery的解決

    這篇文章主要介紹了python常見(jiàn)問(wèn)題之zsh:?command?not?found:?celery的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-07-07

最新評(píng)論

县级市| 宝坻区| 绵阳市| 仁寿县| 黑水县| 松滋市| 平顶山市| 剑阁县| 白河县| 平邑县| 长兴县| 无极县| 理塘县| 阿拉善盟| 伊吾县| 武邑县| 松溪县| 云南省| 吉林省| 益阳市| 伊宁县| 尚志市| 富锦市| 承德市| 密山市| 莆田市| 双鸭山市| 汕尾市| 九龙坡区| 香格里拉县| 莱西市| 洮南市| 木里| 马龙县| 南汇区| 佛教| 灵川县| 海林市| 崇左市| 乌鲁木齐县| 无锡市|