Python的张量运算
目錄
- 1 機器學習中張量的創建
- 2 索引和切片訪問張量中的數據
- 3?張量的整體操作和逐元素運算
- 4 張量的變形和轉置
- 4.1 變形
- 4.2 轉置
- 5 Python中的廣播
- 6 向量和矩陣的點積運算
1 機器學習中張量的創建
機器學習中的張量大多是通過NumPy數組來實現的。NumPy數組和Python的內置數據類型列表不同。列表的元素在系統內存中是分散存儲的,通過每個元素的指針單獨訪問,而NumPy數組內各元素則連續的存儲在同一個內存塊中,方便元素的遍歷,并可利用現代CPU的向量化計算進行整體并行操作,提升效率。因此NumPy數組要求元素都具有相同的數據類型,而列表中各元素的類型則可以不同。
import numpy as np # 導入NumPy數學工具集 list=[1,2,3,4,5] # 創建列表 array_01=np.array([1,2,3,4,5]) # 列表轉化成數組 array_02=np.array((6,7,8,9,10)) # 元組轉化成數組 array_03=np.array([[1,2,3],[4,5,6]]) # 列表轉化成2D數組 print ('列表:', list) print ('列表轉化為數組:', array_01) print ('元組轉化為數組:', array_02) print ('2D數組:', array_03) print ('數組的形狀:', array_01.shape) # print ('列表的形狀:', list.shape) # 列表沒有形狀,程序會報錯運行結果
上面都是使用Num Py的array方法把元組或者列表轉換為數組,而Num Py也提供了一些方法直接創建一個數組:
運行結果:
arange和linspace都是創建連續等差數組,但是兩者有區別:
(1)arange()函數類似內置函數range(),通過指定初始值,終值,步長來創建等差數列的一維數組,默認是不包括終值的。
linSpace()是lin space 的縮寫,代表的是線性等分向量的含義。它是通過指定初始值,終值,元素個數來創建等差數組的,默認是包括終值的。
(2)arange的類型是int64,而linspace是float64的。
當然,機器學習的數據集并不是在程序里面創建的,大多是先從文本文件中把所有樣本讀取至Dataframe格式的數據,然后用array方法或其他方法把Dataframe格式的數據轉換為NumPy數組,也就是張量,再進行后續操作。
2 索引和切片訪問張量中的數據
array_06 = np.arange(10) print (array_06) index_01 = array_06[3] # 索引-第4個元素 print ('第4個元素', index_01) index_02 = array_06[-1] # 索引-最后一個元素 print ('第-1個元素', index_02) slice_01 = array_06[:4] # 從0到4切片 print ('從0到4切片', slice_01) slice_02 = array_06[0:12:4] # 從0到12切片,步長為2 print ('從0到12切片,步長為4', slice_02)
注:
數組無論是生成的時候,還是訪問的時候,都是從0開始的。索引3,就是第4個元素。
負號,表示針對當前軸終點的相對位置,因此這里-1指的就是倒數第一個元素。冒號,是指區間內的所有元素,如果沒限定區間,就代表軸上面的所有元素。反正Python的語法挺靈活的,你們甚至可以用3個點(省略號)來代替多個冒號。
from keras.datasets import mnist #需要打開internet選項) (X_train, y_train), (X_test, y_test) = mnist.load_data() print (X_train.shape) X_train_slice = X_train[10000:15000,:,:]10000:15000,就是把樣本軸進行了切片。而后面兩個冒號的意思是,剩下的兩個軸里面的數據,全都保留(對這個圖片樣本集,如果后面兩個軸也切片,圖片的28px×28px的結構就被破壞了,相當于把圖片進行了裁剪)。
array_07 = np.array([[1,2,3],[4,5,6]]) print (array_07[1:2],'它的形狀是', array_07[1:2].shape) print (array_07[1:2][0], '它的形狀又不同了', array_07[1:2][0].shape)此示例意在提高大家對數組(即張量)形狀和階數的敏感度。同樣都是4、5、6這3個數字形成的張量,[[4 5 6]]被兩個方括號括起來,[4 5 6]被一個方括號括起來,兩者階的數目就不一樣。還是那句話,張量是機器學習的數據結構,其形狀是數據處理的關鍵,這是不能馬虎的。
3?張量的整體操作和逐元素運算
張量的算術運算,包括加、減、乘、除、乘方等,既可以整體進行,也可以逐元素進行。
這種整體性的元素操作,省時、省力、速度快,是大規模并行計算優越性的實現。
4 張量的變形和轉置
4.1 變形
注:
調用reshape方法時,變形只是暫時的,調用結束后,張量本身并無改變。如果要徹底地改變張量的形狀需要賦值操作array_07 = array_07.reshape(3,2) #進行賦值才能改變數組本身
4.2 轉置
數學概念:行變列,列變行
5 Python中的廣播
廣播(broadcasting)是NumPy對形狀不完全相同的數組間進行數值計算的方式,可以自動自發地把一個數變成一排的向量,把一個低維的數組變成高維的數組。
機器學習領域有這樣一種說法,如果使用很多的for循環語句,那么說明此人還未了解機器學習的精髓。首先利用了Python對于數組,也就是張量整體地并行操作。很大、很高階的數據集,讀入Num Py數組之后,并不需要循環嵌套來處理,而是作為一個整體,直接加減乘除、賦值、訪問。這種操作很好地利用了現代CPU以及GPU/TPU的并行計算功能,效率提升不少。
運行結果:
對兩個數組, 從后向前比較它們的每一個階(若其中一個數組沒有當前階則忽略此階的運算)
對于每一個階, 檢查是否滿足下列條件:
if當前階的維度相等
then可以直接進行算術操作
else if當前階的維度不相等, 但其中一個的值是1
then通過廣播將值為1的維度進行“復制”(也形象地稱為“拉伸”)后, 進行算術操作;
else if, 上述條件都不滿足, 那么兩個數組當前階不兼容, 不能夠進行廣播操作
then拋出 “Value Error: operands could not be broadcast together” 異常;
注:
如果兩個張量出現形狀不匹配而不能廣播的情況,系統會報錯。此時可以通過reshape方法轉換其中一個張量的形狀。
6 向量和矩陣的點積運算
點積運算在機器學習中是非常重要
6.1 向量點積運算
這個過程中要求向量a和向量b的維度相同。向量點積的結果是一個標量,也就是一個數值。
運算結果:
6.2 矩陣點積運算
矩陣和矩陣之間的點積,大家就只需要牢記一個原則:第一個矩陣的第1階,一定要和第二個矩陣的第0階維度相同。即,形狀為(a,b)和(b,c)的兩個張量中相同的b維度值,是矩陣點積實現的關鍵,其點積結果矩陣的形狀為(a,c)。
運算結果:
總結
以上是生活随笔為你收集整理的Python的张量运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]中国七大顶级黑客X档案
- 下一篇: python正交表运用