numpy中矩阵运算的特点
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了numpy中矩阵运算的特点相关的知识,希望对你有一定的参考价值。
简 介: 在numpy中的一维和二维数组与线性代数中的矩阵和向量的概念有区别,也有联系。恰当掌握numpy中的矩阵运算特点可以大大提高程序的编写的效率。这其中需要不断的做斗争的就是区分一维向量与一维矩阵之间的差异性。
关键词
: numpy,matrix,dimension
§01 矩阵与向量
在 numpy中的矩阵与数学上的矩阵的关系 讨论了numpy中的矩阵与向量关系。
一、矩阵
numpy中的矩阵具有二维的结构。
1、初始化一个随机矩阵
from headm import *
a = random.rand(2, 3)
printf(a, type(a), a.shape)
[[0.4336234 0.77036849 0.60096793]
[0.0316234 0.99120883 0.53601667]]
<class 'numpy.ndarray'>
(2, 3)
2、矩阵操作
(1)正常矩阵相乘
from headm import *
a = random.rand(2, 3)
b = random.rand(3, 2)
c = dot(a,b)
printf(c, type(c), c.shape)
[[0.7684459 0.29381061]
[0.76060152 0.46711189]]
<class 'numpy.ndarray'>
(2, 2)
(2)矩阵广播操作
c = a*b
---------- [PYTHON ERROR] 186 ----------
Traceback (most recent call last):
File "d:\\temp\\TEMP0001\\test1.PY", line 13, in <module>
c = a*b
ValueError: operands could not be broadcast together with shapes (2,3) (3,2)
但如果a,b是相同尺寸,可以使用这种广播操作:
from headm import *
a = random.rand(2, 3)
b = random.rand(2, 3)
c = a*b
printf(c, type(c), c.shape)
[[0.2393848 0.41071455 0.16750262]
[0.70508388 0.14090312 0.16709447]]
<class 'numpy.ndarray'>
(2, 3)
3、矩阵转置
from headm import *
a = random.rand(2, 3)
b = a.T
c = dot(a,b)
printf(c, type(c), c.shape)
[[0.47551039 0.46143036]
[0.46143036 1.11436681]]
<class 'numpy.ndarray'>
(2, 2)
二、向量
1、列向量与行向量
下面展示通过一个列向量与其转置(行向量)的矩阵相乘,形成一个对称方阵。
from headm import *
a = random.rand(5, 1)
b = a.T
c = dot(a,b)
printf(a,b,c)
[[0.53296778]
[0.78546112]
[0.94781325]
[0.52827569]
[0.12897877]]
[[0.53296778 0.78546112 0.94781325 0.52827569 0.12897877]]
[[0.28405466 0.41862547 0.50515393 0.28155392 0.06874153]
[0.41862547 0.61694917 0.74447046 0.41494002 0.10130781]
[0.50515393 0.74447046 0.89834995 0.5007067 0.12224778]
[0.28155392 0.41494002 0.5007067 0.27907521 0.06813635]
[0.06874153 0.10130781 0.12224778 0.06813635 0.01663552]]
下面展示通过一个行向量与一个其转置(列向量)的矩阵相乘,也就是内积,所获得的的 一个取值。
from headm import *
a = random.rand(1, 5)
b = a.T
c = dot(a,b)
printf(a,b,c)
[[0.01240721 0.93461735 0.77328477 0.75715417 0.90210299]]
[[0.01240721]
[0.93461735]
[0.77328477]
[0.75715417]
[0.90210299]]
[[2.85870512]]
上面看到,虽然向量只有一行,或者一列,但仍然是二维的。
2、一维向量
一维矩阵和它的的转置,都是一样的:
- dot,对应的是内积;
-
- , 对应的是对位相乘;
- 可以 sqrt, exp, log 进行广播操作。
from headm import *
a = random.rand(5)
printf(a, a.shape)
b = a.T
printf(b, b.shape)
printf(dot(a,b), a*b, sqrt(a*b), exp(a), log(exp(a)))
[0.81684852 0.56601384 0.19416386 0.40459394 0.39197519]
(5,)
[0.81684852 0.56601384 0.19416386 0.40459394 0.39197519]
(5,)
1.342653579591815
[0.6672415 0.32037167 0.0376996 0.16369626 0.15364455]
[0.81684852 0.56601384 0.19416386 0.40459394 0.39197519]
[2.26335566 1.76123249 1.21429524 1.49869382 1.47990099]
[0.81684852 0.56601384 0.19416386 0.40459394 0.39197519]
三、1维与2维转换
1、1维转换成2维
(1)方法一
from headm import *
a = array([1,2,3,4,5])
printf(a, type(a), a.shape)
a = a.reshape(-1,1)
printf(a, type(a), a.shape)
a = a.reshape(1, -1)
printf(a, type(a), a.shape)
[1 2 3 4 5]
<class 'numpy.ndarray'>
(5,)
[[1]
[2]
[3]
[4]
[5]]
<class 'numpy.ndarray'>
(5, 1)
[[1 2 3 4 5]]
<class 'numpy.ndarray'>
(1, 5)
(2)方法二
from headm import *
a = array([1,2,3,4,5])
printff(a, type(a), a.shape)
a = a[:,newaxis]
printf(a, type(a), a.shape)
a = a.reshape(1, -1)
printff(a, type(a), a.shape)
[1 2 3 4 5] <class 'numpy.ndarray'> (5,)
[[1]
[2]
[3]
[4]
[5]]
<class 'numpy.ndarray'>
(5, 1)
[[1 2 3 4 5]] <class 'numpy.ndarray'> (1, 5)
from headm import *
a = array([1,2,3,4,5])
printff(a, type(a), a.shape)
a = a[newaxis, :]
printff(a, type(a), a.shape)
[1 2 3 4 5] <class 'numpy.ndarray'> (5,)
[[1 2 3 4 5]] <class 'numpy.ndarray'> (1, 5)
1、2维转换成1维
from headm import *
a = array([[1,2,3,4,5],[5,4,3,2,1]])
printff(a, type(a), a.shape)
a = a.flatten()
printff(a, type(a), a.shape)
a = a.flatten()
printff(a, type(aPython的Numpy库中各种矩阵基本运算的示例代码(加减乘点乘点除乘方转置等)