1. 实验
最近学习吴恩达大大的深度学习教程第二周2.15节数组广播相关内容时,实验研究了一下。
上图为吴恩达教授总结的使用numpy广播的注意事项,经过研究,有些收获。实验如下:
#构建a,b,c,d 4个变量
import numpy as np
a=np.arange(1,13,1)
a=a.reshape(3,4) ###构建3行4列的数组,后面计算有用
b=np.array([1,2,3,4])
c=np.mat([1,2,3,4])
d=b.reshape(1,4)
接下来分别打印4个变量看一下:
print("a,b,c,d依此为:\n",a,"\n++++++++++\n",b,"\n++++++++++\n",c,"\n++++++++++\n",d)
#打印结果:
a,b,c,d依此为:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
++++++++++
[1 2 3 4]
++++++++++
[[1 2 3 4]]
++++++++++
[[1 2 3 4]]
b跟c相差一对方括号,c跟d打印结果完全一样。
接下来咱们依次打印变量类型:
print(type(a),a.shape) ### <class'numpy.ndarray'> reshape后的a仍为数组(3,4)
print(type(b),b.shape) ###<class 'numpy.ndarray'> (4,)
print(type(c),c.shape) ###<class 'numpy.matrix'> (1, 4)
print(type(d),d.shape) ###<class 'numpy.ndarray'> (1, 4)
2.结果说明
以上结果表明:变量c是二维矩阵(shape有2个数,且矩阵有两个[[ ),变量d是二维数组,变量b是一维数组(shape有1个数,且数组有1个[ ),
接下来用变量a分别跟b、c、d进行相乘(可以广播)、相加(可以广播)、求哈达玛积(同型矩阵对应元素相乘),以研究各种变量的性质:
###a与b的计算
print(a*b) ###结果为(3X4)
print(a+b)
print(np.dot(a,b)) ###广播全部成功,运算结果为(1X3数组)
print("vs")
####a与d的计算
print(a*d)
print(a+d) ###广播成功
print(np.dot(a,d)) ###报错,不符合点积运算规则
####a与c的计算
print(a+c) ###广播成功
print(a*c) ###报错,广播失效
print(np.dot(a,c)) ###报错,不能进行点积运算
以上代码大家可以试一下,看运行结果跟我的一样不。
3.总结
通过上面的计算代码,我个人认为:
1.数组广播,是指数组之间在进行加减乘除四则运算时数据的复制。这里的乘运算 是哈达玛积
2.当我们使用np.array([1,2,3,4])构造数组时,是将列表转为数组,默认的shape就是(4,),所以用reshape()函数重塑形状真的很有必要。
纯手打,不对的地方希望各位批评指正。转载请注明本博客地址!