一、Numpy学习
很详细的教程,值得花时间看一遍:
http://www.runoob.com/numpy/numpy-array-manipulation.html
看完就都懂了,以下总结矩阵运算
二、矩阵运算总结
1、数组与矩阵的转换
(1)矩阵与数组区别:
matrix是array的分支,matrix和array在很多时候都是通用的,你用哪一个都一样。但这时候,官方建议大家如果两个可以通用,那就选择array,因为array更灵活,速度更快,很多人把二维的array也翻译成矩阵。
但是matrix的优势就是相对简单的运算符号,比如两个矩阵相乘,就是用符号*,但是array相乘不能这么用,得用方法.dot()。 array的优势就是不仅仅表示二维,还能表示3、4、5…维,而且在大部分Python程序里,array也是更常用的。
详见:https://blog.csdn.net/vincentlipan/article/details/20717163
(2)数组矩阵转换
方法一:
可以通过下面的两条命令轻松的实现两者之间的转换:np.asmatrix
和np.asarray
import numpy.matlib
import numpy as np
i = np.matrix('1,2;3,4')
j = np.asarray(i)
k = np.asmatrix (j)
方法二:
array转matrix:用mat()
randMat=mat(random.rand(4,4))
matrix转array:matrix.A
见:https://blog.csdn.net/CrozonKDD/article/details/81297921
2、矩阵乘法
import numpy as np
a=np.asarray([[10,20],[30,40]])
b=np.asarray([[0, 1],[ 2, 3]])
m = np.matrix('10,20;30,40')
n = np.matrix('0,1;2,3')
#array对应位置相乘
c=a*b # array([ 0, 20].[ 60, 120])
#矩阵乘法
c = np.dot (a, b) #[[ 40 70],[ 80 150]]
c = np.matmul(a, b) #[[ 40 70],[ 80 150]]
c = m*n #[[ 40 70],[ 80 150]]
c= m*b #matrix与array直接相乘,[[ 40 70],[ 80 150]]
ndarray与ndarray相乘,结果还是ndarray; mtrix与ndarray相乘,结果为matrix
3、矩阵转置,求逆
- 对
axis
进行赋值
当axis
的值为0的时候,将会以列作为查找单元, 当axis的值为1的时候,将会以行作为查找单元。
print("sum =",np.sum(a,axis=1))
print("min =",np.min(a,axis=0))
print("max =",np.max(a,axis=1))
2、
#转置
c.T
np.transpose(A)
#求逆
c.I
3、特殊转置clip()函数
这个函数的格式是clip(Array,Array_min,Array_max)
,顾名思义,Array指的是将要被执行用的矩阵,而后面的最小值最大值则用于让函数判断矩阵中元素,将矩阵中比最小值小的或者比最大值大的元素转换为最小值或者最大值。
print(A)
# array([[14,13,12,11]
# [10, 9, 8, 7]
# [ 6, 5, 4, 3]])
print(np.clip(A,5,9))
# array([[ 9, 9, 9, 9]
# [ 9, 9, 8, 7]
# [ 6, 5, 5, 5]])
4、矩阵的秩
在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank),和线性代数中的秩不是一样的;
在用python求线代中的秩中,我们用numpy包中的linalg.matrix_rank方法计算矩阵的秩。
import numpy as np
i = np.matrix(np.eye(4))
print(type(i))
print(np.linalg.matrix_rank(i))
i = np.eye(4)
print(type(i))
print(np.linalg.matrix_rank(i))
5、求特征值特征向量
a,b=numpy.linalg.elg(x)
#a 特征值
#b 特征向量
如果x为array,a,b也为array; 如果x为matrix,a,b也为matrix
6、矩阵分解
https://blog.csdn.net/luoganttcc/article/details/79014809
7、其他
flatten矩阵展开函数:将多维的矩阵进行展开成1行的数列
print(A.flatten())
# array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
for item in A.flat:
print(item)
# 3
# 4
……
# 14
最大最小,总值
np.sum(A) # 4.4043622002745959
np.min(A) # 0.23651223533671784
np.max(A) # 0.90438450240606416
求均值
np.average(A)
np.mean(A) 或 A.mean()
求解中位数
A.median()
diff累差
该函数计算的便是每一行中后一项与前一项之差。故一个3行4列矩阵通过函数计算得到的矩阵便是3行3列的矩阵。
np.diff(A) # 累差
nonzero()函数
nonzero(a) 将对矩阵a的所有非零元素, 将其分为两个维度, 返回其在各维度上的目录值。
如果 a=mat([ [1,0,0],
[1,0,0],
[0,0,0]])
则 nonzero(a) 返回值为 (array([0, 1]), array([0, 0])) , 因为矩阵a只有两个非零值, 在第0行、第0列,和第1行、第0列。所以结果元组中,第一个行维度数据为(0,1) 元组第二个列维度都为(0,0)。
sort排序函数
对所有元素进行仿照列表一样的排序操作,但仅针对每一行进行从小到大排序操作:
import numpy as np
A = np.arange(14,2, -1).reshape((3,4))
# array([[14, 13, 12, 11],
# [10, 9, 8, 7],
# [ 6, 5, 4, 3]])
print(np.sort(A))
# array([[11,12,13,14]
# [ 7, 8, 9,10]
# [ 3, 4, 5, 6]])