解析引语
在归纳整理numpy的知识前,先整理一部分曾经在学习时遇到的个人认为的难点,在其他介绍基础使用方式的文章时,方便引用此文
首先讲一下广播计算的原则:
如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
多维数组的广播计算方式
在刚开始学习多维数组时,算是遇到的第一个理解方面的困难,仔细观察了几个小时,弄明白了计算方式,如果有问题或遗漏,欢迎在评论中指点,笔者发现问题或遗漏会在第一时间更新。
首先创建一个一维数组
a_1 = np.arange(2).reshape(2)
>>>a_1
[0 1]
------------------------------------------------
再创建一个二维数组
a_2 = np.arange(6).reshape(2,3)
>>>a_2
[[0 1 2]
[3 4 5]]
此时使用a_1+a_2
>>>a_1+a_2
Traceback (most recent call last):
File "D:/py_learn/tensorflow_test/numpy_01.py", line 13, in <module>
print(a_2+a_1)
ValueError: operands could not be broadcast together with shapes (2,3) (2,)
发现处理会报错,想一下,在数组中,第一,维度是不同的,第二,最小维度中数字个数是不同的,因此失败。那么,我们如果把维度改成相同,再计算一下
a_1 = np.arange(2).reshape(2,1)
[[0]
[1]]
a_2 = np.arange(6).reshape(2,3)
[[0 1 2]
[3 4 5]]
>>>a_1+a_2
[[0 1 2]
[4 5 6]]
可以看到,加法进行后,得到了结果,按照格式a_2中每组数都加了a_1中对应的值
那么,低维度的数组是否能够和高维度的数组进行计算呢?
那么尝试一下,reshape(3)的数据
a_1 = np.arange(3).reshape(3)
>>>a_1
[0 1 2]
>>>a_1+a_2
[[0 2 4]
[3 5 7]]
发现同样可以进行计算,那么我们提高维度,尝试一下reshape(1,3)的数据
a_1 = np.arange(3).reshape(1,3)
>>>a_1
[[0 1 2]]
根据数据的结构来看,似乎只是多了一层,那效果是否和reshape(3)的数据一样呢?
经过计算,得到结果:
[[0 2 4]
[3 5 7]]
和reshape(1,3)的效果完全一样,那再更高维度的数组呢?尝试一下
建立多个数组尝试下
a_3 = np.arange(24).reshape(2,3,4)
a_4 = np.arange(3).reshape(1,3,1)
a_5 = np.arange(3).reshape(3,1)
a_6 = np.arange(3).reshape(1,3)
a_7 = np.arange(3).reshape(1,4)
a_8 = np.arange(6).reshape(2,3)
a_9 = np.arange(12).reshape(3,4)
a_10 = np.arange(9).reshape(3,3)
将4-10的数据分别与a_3进行加法计算,发现6、8、10均报错,根据观察以及尝试,得到了结果(以shape角度解释):
1.同维度下的数组:
shape中有不为1的数,该数从后开始数位置与数值与被加的一致,且级数(或长度)不能超过被加的数组,存在部分一样时,剩余级数必须用1代替,如(2,3,4)与(1,1,3,1)相加,(1,1,3,1)有4级,超过三级,是不可以的,另外如(2,3,4,5)与(1,3,4,1)相加,是可以的;
2.不同维度下的数组:
同上,shape中前面的1可以省略,但后面的一定不可以!如上例中的(2,3,4,5)与(1,3,4,1)相加,可以修改为(2,3,4,5)与(3,4,1)相加,但后面的1是必须有的!