numpy学习——难点解析(一)多维数组的广播计算方式

本文深入探讨numpy中多维数组的广播计算原理,从形状匹配的角度出发,通过实例解析不同维度数组如何进行计算。指出广播兼容性的规则,并分析了在不同维度数组相加时的限制条件,为理解和应用numpy的广播功能提供了清晰的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解析引语

在归纳整理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是必须有的!

此篇先以shape的角度来讲,后续会更新,以二维三维的结构角度来讲,未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值