網(wǎng)站首頁 編程語言 正文
一直對(duì)np的線性運(yùn)算不太清晰,正好上課講到了,做一個(gè)筆記整個(gè)理解一下?
1.向量和矩陣
在numpy中,一重方括號(hào)表示的是向量vector,vector沒有行列的概念。二重方括號(hào)表示矩陣matrix,有行列。
代碼顯示如下:
import numpy as np
a=np.array([1,2,3])
a.shape
#(3,)
b=np.array([[1,2,3],[3,4,5]])
b.shape
#(2, 3)
c=np.array([[1],[2],[3]])
c.shape
#(3, 1)
即使[1,2,3]、[[1,2,3]]看起來內(nèi)容一樣 使用過程中也會(huì)有完全不一樣的變化。下面以向量乘法為例解釋。
2.向量和向量乘法
1.* 對(duì)應(yīng)對(duì)應(yīng)位置相乘
普通的*:在numpy里表示普通的對(duì)應(yīng)位置相乘,注意相乘的兩個(gè)向量、矩陣要保證維數(shù)相同
a1=np.array([1,2,3])
a2=np.array([1,2,3])
a1*a2
#array([1, 4, 9])
b1=np.array([[1,2,3]])
b2=np.array([[1,2,3]])
b1*b2
#array([[1, 4, 9]])
b1=np.array([[1,2,3],[3,4,5]])
b2=np.array([[1,2,3],[3,4,5]])
b1*b2
# array([[ 1, 4, 9],
# [ 9, 16, 25]])
2.廣播機(jī)制
如果單純出現(xiàn)維數(shù)對(duì)不上,python會(huì)報(bào)error
b1=np.array([[1,2]])
b2=np.array([[1,2,3]])
b1*b2
#operands could not be broadcast together with shapes (1,2) (1,3)
但是,還有一種情況會(huì)出現(xiàn)乘出來一個(gè)好大的矩陣,這個(gè)情況常出現(xiàn)在無意之中把行、列的數(shù)字搞反的情況下。被稱為廣播機(jī)制,需要兩個(gè)乘子都有一個(gè)維數(shù)是1,如果是對(duì)不上且不為1就會(huì)報(bào)錯(cuò)
Numpy中的廣播機(jī)制,你確定正確理解了嗎?
在普通的對(duì)應(yīng)位置相乘,會(huì)出現(xiàn)?
a1=np.array([1,2,3])
a3=np.array([[1],[2],[3]])
a1*a3#broadcast together
# array([[1, 2, 3],
# [2, 4, 6],
# [3, 6, 9]])
倒過來也會(huì)出現(xiàn)
a1=np.array([1,2,3])
a3=np.array([[1],[2],[3]])
a3*a1#broadcast together
# array([[1, 2, 3],
# [2, 4, 6],
# [3, 6, 9]])
3.向量點(diǎn)乘np.dot
必須要(行向量,列向量)形式的輸入
a1=np.array([1,2,3])
a3=np.array([[1],[2],[3]])
np.dot(a3,a1)
#array([14])
#ValueError: shapes (3,1) and (3,) not aligned: 1 (dim 1) != 3 (dim 0)
?都是行向量,不行
b1=np.array([[1,2,3]])
b2=np.array([[1,2,3]])
np.dot(b1,b2)
#shapes (1,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)
都是列向量,觸發(fā)廣播機(jī)制
a1=np.array([[1,2,3]])
a3=np.array([[1],[2],[3]])
np.dot(a3,a1)
# array([[1, 2, 3],
# [2, 4, 6],
# [3, 6, 9]])
3.矩陣和向量乘法
1.對(duì)應(yīng)位置相乘
如果單純采用*的方式進(jìn)行矩陣和向量乘法,那就是廣播機(jī)制
矩陣+向量
A1=np.array([[1,2,3],[2,3,4]])
b1=np.array([1,2,3])
A1*b1 #broadcast together
# array([[ 1, 4, 9],
# [ 2, 6, 12]])
?對(duì)應(yīng)的向量如果是矩陣形式,結(jié)果相同
A2=np.array([[1,2,3],[2,3,4]])
b2=np.array([[1,2,3]])
A2*b2 #broadcast together
# array([[ 1, 4, 9],
# [ 2, 6, 12]])
相似的,如果維數(shù)對(duì)不上,不會(huì)觸發(fā)廣播機(jī)制
A3=np.array([[1,2,3],[2,3,4]])
b3=np.array([[1],[2],[3]])
A3*b3 #operands could not be broadcast together with shapes (2,3) (3,1)
2.矩陣乘法
如果真正想要算矩陣*向量的矩陣乘法,要用np.dot
A4=np.array([[1,2,3],[2,3,4]])
b4=np.array([1,2,3])
np.dot(A4,b4)#dot product
#array([14, 20])
列向量也有類似結(jié)果
A4=np.array([[1,2,3],[2,3,4]])
b4=np.array([[1],[2],[3]])
np.dot(A4,b4)#dot product
# array([[14],
# [20]])
4.矩陣矩陣乘法?
1.直接相乘
同樣,也是對(duì)應(yīng)位置相乘
A4=np.array([[1,2,3],[2,3,4]])
B4=np.array([[1,2,3],[4,5,6]])
A4*B4
# array([[ 1, 4, 9],
# [ 8, 15, 24]])
?有廣播機(jī)制
A4=np.array([[1,2,3],[2,3,4]])
B4=np.array([[1,2,3]])
A4*B4
# array([[ 1, 4, 9],
# [ 2, 6, 12]])
2.np.dot
需要第一個(gè)的列數(shù)和第二個(gè)的行數(shù)相對(duì)應(yīng)
A4=np.array([[1,2,3],[2,3,4]])
B4=np.array([[1,2,3],[4,5,6]])
np.dot(A4,B4.T)
# array([[14, 32],
# [20, 47]])
A5=np.array([[1,2,3],[2,3,4]])
B5=np.array([[1,2,3],[4,5,6],[7,8,9]])
np.dot(A5,B5)
# array([[30, 36, 42],
# [42, 51, 60]])
對(duì)不上會(huì)報(bào)錯(cuò)
A4=np.array([[1,2,3],[2,3,4]])
B4=np.array([[1,2,3],[4,5,6]])
np.dot(A4,B4)
# shapes (2,3) and (2,3) not aligned: 3 (dim 1) != 2 (dim 0)
5.np.dot 和np.matmul的區(qū)別
Numpy中np.dot與np.matmul的區(qū)別
主要參考以上博客。
1.在二維(矩陣中),二者是一致的
2.在三維(張量中),二者有差別。
?以原博客中的例子為例
a = np.array([i for i in range(12)]).reshape([2,2,3])
b = np.array([i for i in range(12)]).reshape([2,3,2])
"""
a
[[[ 0 1 2]
[ 3 4 5]]
[[ 6 7 8]
[ 9 10 11]]]
b
[[[ 0 1]
[ 2 3]
[ 4 5]]
[[ 6 7]
[ 8 9]
[10 11]]]
"""
np.dot很清晰,就是a的每一行分別和b的兩層乘起來,于是2*2輸出了四個(gè)“矩陣”(表示成4維的常數(shù)):
"""
a11= [ 0 1 2]
a12= [ 3 4 5]
a21= [ 6 7 8]
a22= [ 9 10 11]
b
[[[ 0 1]
[ 2 3]
[ 4 5]]
[[ 6 7]
[ 8 9]
[10 11]]]
c[:,i,j]=aij*b
"""
如:
[ 10, ?13]?=[0 1 2]*[[ 0 ?1]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ 2 ?3]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ 4 ?5]]
? [ 28, ?31]=[0 1 2]*[[ 6 ?7]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ 8? 9]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ 10? 11]]
>>> np.dot(a,b)
array([[[[ 10, 13],
[ 28, 31]],
[[ 28, 40],
[100, 112]]],
[[[ 46, 67],
[172, 193]],
[[ 64, 94],
[244, 274]]]])
>>> np.dot(a,b).shape
(2, 2, 2, 2)
np.matmul的結(jié)果:
>>> np.matmul(a,b)
array([[[ 10, 13],
[ 28, 40]],
[[172, 193],
[244, 274]]])
>>> np.matmul(a,b).shape
(2, 2, 2)
可以看出,如果把np.dot視為8行、matmul視為4行的話,matmul正好取第1、3、6、8四行,也就是第一層的前兩行和第二層的后兩行……
直觀理解,ok
原文鏈接:https://blog.csdn.net/weixin_55703970/article/details/129006976
相關(guān)推薦
- 2022-09-22 Mybaits一級(jí)緩存和二級(jí)緩存分別是什么,區(qū)別是什么?
- 2022-03-18 C++類和對(duì)象之封裝詳解_C 語言
- 2023-12-14 【datetime模塊】將時(shí)間加一秒或者減一秒
- 2023-07-07 Minio提示:io.minio.errors.InvalidResponseException:
- 2022-06-07 ASP.NET?Core依賴關(guān)系注入_基礎(chǔ)應(yīng)用
- 2022-09-26 使用JDBC連接數(shù)據(jù)庫執(zhí)行sql語句,創(chuàng)建數(shù)據(jù)庫連接池
- 2022-04-16 Python數(shù)據(jù)結(jié)構(gòu)與算法之跳表詳解_python
- 2022-08-07 C++從文件中提取英文單詞的實(shí)現(xiàn)方法_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支