numpy一维数组和矩阵

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
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(机器学习,Numpy,机器学习)