python中ndarray和matrix


1. 定義ndarray和matrix

from numpy import *

a = mat([[1,2],[3,4]])
b = mat([[5,6],[7,8]])
c = array([1,2],[3,4])
d = array([5,6],[7,8])

看看輸出他們會不會有什么區別

print(a)
print(c)

>>[[1 2]
   [3 4]] 
  [[1 2]
   [3 4]]
#發現輸出的matrix和array是一模一樣的
print(type(a))
print(type(c))

>> <class 'numpy.matrix'>
   <class 'numpy.ndarray'>

2. ndarray可以是任意維數,matrix只能是2維

A = array([[[1,2]]]) #正常不報錯
B = mat([[[1,2]]])   #報錯

>>ValueError: matrix must be 2-dimensional

3. 乘法

3.1 ndarray

3.1.1 叉乘

print(c)
print(d)
print(np.dot(c,d))

>>[[1 2]
  [3 4]]
  [[5 6]
  [7 8]]
  [[19 22]
  [43 50]]
#可以看出ndarray也可以像矩陣一樣進行叉乘,但需要滿足矩陣叉乘的條件(第一個矩陣的列數等於第二個矩陣的行數)

3.1.2 普通乘法

print(c)
print(d)
print(c*d)

>>[[1 2]
 [3 4]]
[[5 6]
 [7 8]]
[[ 5 12]
 [21 32]]
#普通乘法是對應位置元素相乘

3.2 matrix

3.2.1 叉乘

print(a)
print(b)
print(np.dot(a,b))

>>[[1 2]
  [3 4]]
  [[5 6]
  [7 8]]
  [[19 22]
  [43 50]]
#矩陣叉乘

3.2.2 普通乘法

print(a)
print(b)
print(a*b)

>>[[1 2]
  [3 4]]
  [[5 6]
  [7 8]]
  [[19 22]
  [43 50]]
#這里發現對於矩陣運算符"*"直接對應的是叉乘,和np.dot()效果相同
print(a)
print(b)
print(np.multiply(a,b))

>>[[1 2]
  [3 4]]
  [[5 6]
  [7 8]]
  [[ 5 12]
  [21 32]]
#如果非要對矩陣進行普通乘法,可以通過np.multiply()實現

那么ndarray和matrix能否混合做乘法呢,結果是點乘還是叉乘呢?

print(a)
print(b)
print(a*d)

>>[[1 2]
 [3 4]]
[[5 6]
 [7 8]]
[[19 22]
 [43 50]]
#可以對matrix和ndarray進行混合乘法,這里的運算符"*"是叉乘

當然啦也可以通過np.multiply()對matrix和ndarray進行點乘

print(a)
print(b)
print(np.multiply(a,d))

>>[[1 2]
  [3 4]]
  [[5 6]
  [7 8]]
  [[ 5 12]
  [21 32]]

4. ndarray和matrix互相轉換

4.1 matrix → ndarray

使用matrix對象的A屬性或者np.asarray()方法

e = a.A
f = np.asarray(a)
print(type(e))
print(e)
print(type(f))
print(f)

>><class 'numpy.ndarray'>
[[1 2]
 [3 4]]
<class 'numpy.ndarray'>
[[1 2]
 [3 4]]
#這兩種方法都可以將matrix轉化為ndarray

但是需要注意注意通過轉化得到的ndarray(在這里是e和f)和原始matrix(這里是a)共享內存空間,修改了a之后e和f的值也會被修改

a[1,1] = 2
print(e)
print(f)

>>[[1 2]
 [3 2]]
[[1 2]
 [3 2]]
#在修改了a中元素的值后e,f的值都隨之改變

當然了,在改變e或f的值后,a的值也會隨之改變

e[1,1] = 3
print(a)

>>[[1 2]
  [3 3]]

4.2 ndarray → matrix

使用np.asmatrix()方法

e = np.asmatrix(c)
print(e)

>>[[1 2]
 [3 4]]

同樣的,通過轉化得到的matrix和原始ndarray共享內存空間

5. ndarray和matrix的其他區別

5.1 matrix更多的操作方法

matrix 和 array 都可以通過objects后面加.T 得到其轉置。但是 matrix objects 還可以在后面加 .H f得到共軛矩陣, 加 .I 得到逆矩陣。

5.2 **運算符

** 運算符的作用也不一樣 :因為a是個matrix,所以a**2返回的是a*a,相當於矩陣相乘。而c是array,c**2相當於,c中的元素逐個求平方

5.3 matrix維數總保持2維

ndarray與matrix的最大的不同是,在做歸約運算時,ndarray的維數會發生變化,但matrix總是保持為2維。例如下面求對行求平均值的運算

print("matrix")
print(a)
print(a.mean(1))
print("ndarray")
print(c)
print(c.mean(1))

>>matrix
[[1 2]
 [3 4]]
[[1.5]
 [3.5]]
ndarray
[[1 2]
 [3 4]]
[1.5 3.5]

參考:https://blog.csdn.net/lylclz/article/details/79843437


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM