查看原文
其他

机器学习储备(7):numpy一维数组和矩阵

2017-11-15 alg-flody 算法channel

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》



主要推送关于算法的分析过程及应用的消息。培养思维能力,注重过程,挖掘背后的原理,刨根问底。本着严谨和准确的态度,目标是撰写实用和启发性的文章,欢迎您的关注。





您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存