我們知道python中 for 循環的效率是不高的,相比之下,直接運用矩陣向量操作(如點乘)可以讓代碼運行更快。因爲在復現paper時候遇到了這樣的問題,在這裏總結一下我的解決方法。
[None, :, :] 介紹
通過None indexing,可以將一個二維矩陣擴展成一個三維矩陣,算是一種 broadcasting吧。一個大小爲[a, b]的矩陣M,在A=M[None, :, :]操作下,A的大小變爲[1, a, b],就相當於在第一維度下有一個大小爲[a, b]的矩陣。
類似的,還有[:, None, :],[:, :, None]操作。
[a, b]–>[:, None, :]–>[a, 1, b]
[a, b]–>[:, :, None]–>[a, b, 1]
總之,None 的作用就是在相應的位置上增加了一個維度,在這個維度上只有一個元素。
具體來看一下一個例子。
import numpy as np
matrix = np.array([[1,2,3],[4,5,6]])
None_1 = matrix[None,:,:]
None_2 = matrix[:,None,:]
None_3 = matrix[:,:,None]
matrix_T = matrix.T
None_1_T = matrix_T[None,:,:]
None_2_T = matrix_T[:,None,:]
None_3_T = matrix_T[:,:,None]
結果如下
通過None Indexing 的操作可以將矩陣分解成幾塊,然後再利用np.sum就可以簡化求和操作了,這一塊下一篇博客會介紹,敬請期待~