Python numpy shape为(x,) 和 shape为(x,1)的区别
笔者最近在用numpy进行ML的学习,numpy确实方便,但是如果不仔细的话,还是会栽不少跟头,所以笔者在这里记录下遇到过的坑,方便大家学习。
稍微一看,shape为(x,)和shape为(x,1)几乎一样,都是一维的形式。其实不然:
- (x,)意思是一维数组,数组中有2个元素
- (x,1)意思是一个x维数组,每行有1个元素
这涉及到一个张量的概念,具体可以看:
小昇的博客-Keras深度学习笔记(二):神经网络的数学基础
这里举几个例子来说明不重视这个点的危害。
- 初始化
a = np.arange(3)
print("a=" ,a.shape)
b = np.arange(15).reshape(5,3)
print("b=" ,b.shape)
输出:
a= (3,)
b= (5, 3)
可以看出,没有指明矩阵形式的时候,默认是一维数组。
- 相乘
c = np.dot(b,a)
print("c=" ,c.shape)
输出:
c= (5,)
矩阵乘法,因为a是一维的形式,所以b相乘之后,维数减少。
- 自身变化
c.reshape(c.shape[0],1)
print("c=" ,c.shape)
ff = c.reshape(c.shape[0],1)
print("ff=" ,ff.shape)
输出
c= (5,)
ff= (5, 1)
这里要注意的是,对自己reshape并不会改变自身的形式!只有赋值给其他变量才会看见效果。这很重要!
- 相加
c = np.arange(5)
print("c=" ,c.shape)
d = np.arange(5).reshape(5,1)
print("d=" ,d.shape)
e = c + d
print("c+d=" ,e.shape)
输出:
c= (5,)
d= (5, 1)
c+d= (5, 5)
一开始以为c会作用于d上的每个数据,直接相加,最后结果还是(5,1)。但是没想到会变成(5,5)这是矩阵相加最需要注意的地方
- 正确相加
c = np.arange(5)
print("c=" ,c.shape)
ff = c.reshape(c.shape[0],1)
print("ff=" ,ff.shape)
d = np.arange(5).reshape(5,1)
print("d=" ,d.shape)
e = ff + d
print("ff+d=" ,e.shape)
输出:
c= (5,)
ff= (5, 1)
d= (5, 1)
ff+d= (5, 1)
正如前面所说,需要先赋值给其他变量,然后再相加,此时才会得出正确结果。
小结:这个小细节曾连续困扰了我好几天,代码一直显示矩阵操作的维数不对,一点点调试才发现了这个问题。如果维数不对,那么结果也一定不对。希望和大家一起学习分享经验!
版权声明:本文为budding0828原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。