因为我的记忆力不好,还得辅导儿子的小学奥数,面对好多“脚”的问题,学了线性代数后根本就不用动脑筋,“两个动物”的通过克拉默法则一下就出来,“三个动物”以上的通过高斯变换就计算出来,都不用思考,于是对线性代数使用python的技术进行总结归纳,为了好玩,也会熟练掌握numpy,以便在神经网络中找到线性代数的身影
1 nump中矩阵运算
1.1 array和matrix
array的乘法,与矩阵的乘法得到结果不同,故虽然array表面和matrix看起来一样,实则不同,
numpy数组,矩阵和列表之间的相互转换,matrix的计算逻辑是a矩阵的行*b矩阵的列,那么数组的乘法计算逻辑是什么呢?numpy中数组和矩阵的乘法,从这篇文章,可以看出数组的乘法是两个数组相同坐标的数值计算,故连个结果不相同
a = np.array([[1,1,1],[0,1,1],[0,0,1]])
b = np.array([[1,0,1],[0,1,0],[1,0,1]])
print(a*b)
a = np.mat([[1,1,1],[0,1,1],[0,0,1]])
b = np.mat([[1,0,1],[0,1,0],[1,0,1]])
print(a*b)
--------------------------------
[[1 0 1]
[0 1 0]
[0 0 1]]
[[2 1 2]
[1 1 1]
[1 0 1]]
虽说如此,但是数组的内积,计算结果又与matrix乘法等价
a = np.array([[1,1,1],[0,1,1],[0,0,1]])
b = np.array([[1,0,1],[0,1,0],[1,0,1]])
print(np.dot(a,b))
print(a.dot(b))
1.2 解决小学奥数的一道题
1.3 矩阵转换
基础参见np.transpose
这里记录一个例子训练分类器,先看pytorch中图片显示问题中描述因为plt.imshow
中参数顺序是imagesize,imagesize,channels
,而npimg的参数顺序是channels,imagesize,imagesize
,所以需要转换。那么为什么转换顺序是1,2,0
呢,我们知道np.transpose的默认顺序是2,1,0
.
def imshow(img):
img = img / 2 + 0.5 # unnormalize
npimg = img.numpy()
# OpenCV读取图像的通道是BGR,而Matplotlib的通道是RGB
plt.imshow(np.transpose(npimg, (1, 2, 0)))
plt.show()
在看一个np.transpose的作用及在图像操作中的使用,你会发现np.transpose
对照片逆时针旋转了90度,而np.transpose(npimp, (1, 2, 0))
则显示的正确视角。
再阅读Pytorch显示图像,
import cv2 as cv
def imcv(img):
npimp = img.numpy()
cv.imshow('img',np.transpose(npimp))
cv.imshow('img2', np.transpose(npimp, (1, 2, 0)))
cv.namedWindow('img', cv.WINDOW_AUTOSIZE)
cv.waitKey(0)
cv.destroyAllWindows()
待完善…