Numpy 是用 python封装的科学计算库,是一个精简版matlab 。 下面总结下在模拟脊回归的超参数:收缩率,与权重参数的关系时,用到的一些numpy运算规则,顺便扩展下其他的相关运算。
1 矩阵相加
原来A和B还能这样相加,请看下列:
A = np.array( [1,2,3] )
np.shape(A)
(3,)
B= np.array([ [10],[11]] )
np.shape(B)
(2,1)
A+B
array([[11, 12, 13],
[12, 13, 14]])
按照我们之前学习的线性代数中,矩阵的相加首先得满足A和B是同型矩阵才行,都是m行n列。所以在numpy操作以上两个数组时,显然不是线性代数意义上的同型矩阵,但是仍然可以相加,这是为什么呢。
原来numpy自动做了一些处理,将A自动补全为B的行数,将B自动补全为A的列数。因此,将 A数组转化为:
array([[1, 2, 3],
[1, 2, 3] ])
将B转化为:
array([[10, 10, 10],
[11, 11, 11]])
然后这样就是线性代数中的同型矩阵了,然后按照理解相加即可。为什么numpy要这么做呢? 注意在线代中的矩阵都是二维数组,观察我们开始说的那个A,它本质上并不是矩阵,只是一个一维数组,关于什么是数组的维数测试,请看本文第3节,所以它要提升1个维度。
2 矩阵转置和shape
大部分情况都和线性代数中的理论相同,比如
A = np.array([[11, 12, 13],
[12, 13, 14]])
np.shape(A)
(2,3)
np.shape(A.T)
(3, 2)
到现在,和我们传统意义上的理解没有什么区别。但是有一种情况,会很特殊,如果数组只有一行,例如:
B = array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),看一下几行几列:
np.shape(B)
(10,)
此处就是与线代不一样的地方,此处,numpy中shape显示的是10,至于为什么显示的是10,因为它是一维的数组,线代中的矩阵都是二维的。
然后,再做转置,如下
np.shape(B.T)
仍然是:(10,)
在B长这个样子下,转置后的样子与原来的样子一样。
观察发现,B和B.T 它们都带一对方括号的,所以shape只显示一个数,对于这种仅含一对方括号的数组而言,都没有几行几列这个说法,因为是一维的。
如果要想做出像线代中的那种1行10列的矩阵,我们在numpy中应该怎么写呢?numpy中的写法如下所示:
B2 = array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]])
此时B2的 shape 结果显示:(1,10)
那么这是如何做到的呢? 需要借助 np.newaxis实现这个功能:B[np.newaxis,:] ,执行它后,B就变为B2了。
由此引出了numpy中的一个重要概念,维数 dimension
3 numpy中的dimension
我们分别测试下上节中的B和B2的维数有什么不同,需要调用numpy中的ndim接口看数组的位数。
B = array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
np.ndim(B)
1
B2 = array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]])
np.ndim(B2)
2
再体验一个维数为3的数组:
test = [[[1,2,3]],[[4,8,12]]]
np.ndim(test)
3
4 总结
总结以上所述,numpy中的一维数组和线代中的矩阵是很不相同的,这样导致了它们的运算也就很不一样;但是numpy中的二维数组就等同于线代中的矩阵了,所以按照线代的理解去对它们做运算,就都符合我们的逻辑习惯了。
---------------------
作者:算法channel
来源:CSDN
原文:https://blog.csdn.net/xo3ylAF9kGs/article/details/78623276
版权声明:本文为博主原创文章,转载请附上博文链接!