日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python的张量运算

發布時間:2024/8/1 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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也提供了一些方法直接創建一個數組:

array_04=np.arange(1, 5, 1) # 通過arange函數生成數組 array_05=np.linspace(1, 5, 5) # 通過linspace函數生成數組 print (array_04) print (array_05)

運行結果:

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的并行計算功能,效率提升不少。

array_08 = np.array([[0,0,0], [10,10,10], [20,20,20], [30,30,30]]) array_09 = np.array([[0,1,2]]) array_10 = np.array([[0],[1],[2],[3]]) list_11 = [[0,1,2]] print ('array_08的形狀:', array_08.shape) print ('array_09的形狀:', array_09.shape) print ('array_10的形狀:', array_10.shape) array_12 = array_09.reshape(3) print ('array_12的形狀:', array_12.shape) array_13 = np.array([1]) print ('array_13的形狀:', array_13.shape) array_14 = array_13.reshape(1,1) print ('array_14的形狀:', array_14.shape) print ('08 + 09結果:',array_08 + array_09) print ('08 + 10結果:',array_08 + array_10) print ('08 + 11結果:',array_08 + list_11) print ('08 + 12結果:',array_08 + array_12) print ('08 + 13結果:',array_08 + array_13) print ('08 + 14結果:',array_08 + array_14)

運行結果:

對兩個數組, 從后向前比較它們的每一個階(若其中一個數組沒有當前階則忽略此階的運算)
對于每一個階, 檢查是否滿足下列條件:
if當前階的維度相等
then可以直接進行算術操作
else if當前階的維度不相等, 但其中一個的值是1
then通過廣播將值為1的維度進行“復制”(也形象地稱為“拉伸”)后, 進行算術操作;
else if, 上述條件都不滿足, 那么兩個數組當前階不兼容, 不能夠進行廣播操作
then拋出 “Value Error: operands could not be broadcast together” 異常;
注:
如果兩個張量出現形狀不匹配而不能廣播的情況,系統會報錯。此時可以通過reshape方法轉換其中一個張量的形狀。

6 向量和矩陣的點積運算

點積運算在機器學習中是非常重要

6.1 向量點積運算


這個過程中要求向量a和向量b的維度相同。向量點積的結果是一個標量,也就是一個數值。

vector_01 = np.array([1,2,3]) vector_02 = np.array([[1],[2],[3]]) vector_03 = np.array([2]) vector_04 = vector_02.reshape(1,3) print ('vector_01的形狀:', vector_01.shape) print ('vector_02的形狀:', vector_02.shape) print ('vector_03的形狀:', vector_03.shape) print ('vector_04的形狀:', vector_04.shape) print ('01和01的點積:', np.dot(vector_01,vector_01)) print ('01和02的點積:', np.dot(vector_01,vector_02)) print ('04和02的點積:', np.dot(vector_04,vector_02)) print ('01和數字的點積:', np.dot(vector_01,2)) print ('02和03的點積:', np.dot(vector_02,vector_03)) print ('02和04的點積:', np.dot(vector_02,vector_04)) # print ('01和03的點積:', np.dot(vector_01,vector_03)) # 程序會報錯 # print ('02和02的點積:', np.dot(vector_02,vector_02))

運算結果:

6.2 矩陣點積運算
矩陣和矩陣之間的點積,大家就只需要牢記一個原則:第一個矩陣的第1階,一定要和第二個矩陣的第0階維度相同。即,形狀為(a,b)和(b,c)的兩個張量中相同的b維度值,是矩陣點積實現的關鍵,其點積結果矩陣的形狀為(a,c)。

matrix_01 = np.arange(0,6).reshape(2,3) matrix_02 = np.arange(0,6).reshape(3,2) print(matrix_01) print(matrix_02) print ('01和02的點積:', np.dot(matrix_01,matrix_02)) print ('02和01的點積:', np.dot(matrix_02,matrix_01)) print ('01和01的點積:', np.dot(matrix_01,matrix_01))

運算結果:

總結

以上是生活随笔為你收集整理的Python的张量运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。