python 張量程式設計

2021-09-25 03:40:42 字數 3218 閱讀 8281

個人看來,張量程式設計最直接的方法是以一維向量為核心,用位置指標程式設計來實現張量運算,而以reshape輔助列印。

例:給定若干組數,各組取出乙個求和,將所有的和放到乙個張量中。

簡單起見,一共就兩組數 x=[2,3],  y=[5,7,11]。各抽取乙個數出來求和將形成乙個矩陣。答案是79

1381014

下面我們寫三種程式並作比較。

python stl list寫法

list是python基礎語言的乙個主要資料結構。它是乙個容器,數學上對應著序列的概念。

好處是處於語言的基礎層,相容性強,擴充套件性強,編寫簡易。

壞處是速度比較慢,不太適合高效能計算。

"""

displaying 2d rectangular table wherein the cells are

evaluated results of a function on the margins.

"""#list version

#delcare left margin of length 2

x = [2,

3]#declare top margin of lenght 3

y = [5,7,11]

#create the index skeleton of the result grid

grididx = range(len(x)*len(y))

#define function

f = lambda i: x[i // 3] + y[i % 3]

#map

gridmap = map(f, grididx)

grid = list(gridmap)

效果:

>>> print(grid)

[7, 9, 13, 8, 10, 14]

>>> import numpy as np

>>> print(np.reshape(grid,(2,3)))

[[ 7 9 13]

[ 8 10 14]]

我們測量一下運算速度,我們將輸入增大到每組1000個數,這樣一來輸出矩陣就有100萬個數的大小。

測下來比想象中快,平均只要花半秒鐘就能算完。

def list_version(n:int):

x = range(n)

#declare top margin of lenght 3

y = range(n)

#create result grid

grididx = range(n * n)

#define function

f = lambda i: x[i // n] + y[i % n]

#map

gridmap = map(f, grididx)

grid = list(gridmap)

>>> %timeit list_version(n=1000)

472 ms ± 37.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

用numpy包寫

以上最後幾行其實已經使用了numpy的reshape功能將1維list變成了2維list。

接下來我們寫乙個純numpy的程式

import numpy as np

#np version

x = np.array([2,

3])y = np.array([5,7,11])

grididx = np.arange(len(x)*len(y))

f = lambda i: x[i // 3] + y[i % 3]

gridmap = map(f, grididx)

grid = np.fromiter(gridmap,dtype=int)

效果一樣:

>>> print(grid.reshape(2,3))

[[ 7 9 13]

[ 8 10 14]]

我們照樣測量一下運算速度,我們將輸入增大到每組1000個數,這樣一來輸出矩陣就有100萬個數的大小。

測下來平均花四分之三秒鐘才算完,這當然不慢,但比list慢是意外的。

def np_version(n:int):

x = np.arange(n)

y = np.arange(n)

grididx = np.arange(n * n)

f = lambda i: x[i // n] + y[i % n]

gridmap = map(f, grididx)

grid = np.fromiter(gridmap,dtype=int)

>>> %timeit np_version(n=1000)

755 ms ± 17.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

用tensorflow-gpu包寫

由於各種真實的和虛晃的營銷策略,現在人們的共識是google做的工作總是好的,比如tensorflow。在沒有仔細研究之前,我也對tensorflow趨之若鶩,直到最近發現連最基本的期待都沒實現:在gpu上並行地算lambda expression這個基本要求難以在tf裡面實現。比如上面這個程式,無法想當然地寫成:

def tf_version(n:int):   

x = tf.range(n)

y = tf.range(n)

grididx = tf.range(n * n)

f = lambda i: x[i // n] + y[i % n]

grid = tf.map_fn(f, grididx)

return grid

with tf.session() as sess:

%timeit sess.run(tf_version(30))

662 ms ± 26.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

注意到n=30就已經不行了。這是因為tf.map_fn沒有實現到gpu上,直接讓整個框架少了一半吸引力。稠密張量計算不配合函式式程式設計是無法發揮的。

pytorch 張量 張量的生成

張量的生成 import torch import numpy as np 使用tensor.tensor 函式構造張量 a torch.tensor 1.0,1.0 2.2 print a 獲取張量的維度 print 張量的維度 a.shape 獲取張量的形狀大小 print 張量的大小 a.si...

Matlab和Python實現張量分解

1.python安裝教程 2.matlab 安裝和張量分解的匯入和使用 matlab的安裝方法 matlab tensor toolbox 實現hosvd 3.張量分解的介紹 cp分解和hosvd分解 張量分解 4.python張量分解 使用python tensorly 實現張量cp分解 使用py...

pytorch 張量 張量的資料型別

張量定義 import torch torch.tensor 1.2 3.4 dtype 獲取張量的資料型別,其中torch.tensor 函式生成乙個張量 torch.float32 torch.set default tensor type torch.doubletensor 設定張量的預設資...