吾日三省 发表于 2023-6-28 12:18:29

【numpy基础】--广播计算

numpy的广播计算是指在多维数组上进行的一种高效计算方式。
它可以将计算任务分配到每个维度上,并且可以在计算过程中进行数据共享和同步,从而提高计算效率和精度。
广播计算在数值计算、科学计算、机器学习等领域都有广泛的应用。
例如,在数值计算中,广播计算可以用于求解大规模的非线性方程组;在科学计算中,广播计算可以用于模拟和预测自然现象;在机器学习中,广播计算可以用于分布式训练和推理等场景。
numpy中广播计算遵循3个严格的规则:

[*]如果两个数组的维度数不相同,小维度数组的形状将会在最左边补1
[*]如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度为1的维度扩展以匹配另一个数组的形状
[*]如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于1,那么会引发异常
广播规则一

比如一维数组和数字运算:
import numpy as np

arr = np.random.randint(1, 10, 5)
print(arr)
#运行结果


print(arr + 1)
#运行结果


print(arr * 2)
#运行结果
arr+1 时,1被自动扩充成,和 arr 一样结构的数组。
arr*2 时,同样,2被自动扩充成,和 arr 一样结构的数组。
二维数组和一维数组运算时:
arr1 = np.random.randint(1, 10, (3, 3))
print(arr1)
#运行结果
[

]

arr2 = np.random.randint(1, 10, 3)
print(arr2)
#运行结果


print(arr1 + arr2)
#运行结果
[[ 7 135]

[ 8 157]]这种情况下,arr2和arr1一样,都是3列,只是行数不一样,所以被自动扩展成:
[

]
然后再和arr1对应的位置进行加法运算。
广播规则二

规则二两个数组每个维度上的数量都不一样,比如如下两个二维数组的运算:
arr1 = np.random.randint(1, 10, (1, 3))
print(arr1)
#运行结果
[]

arr2 = np.random.randint(1, 10, (3, 1))
print(arr2)
#运行结果
[

]

print(arr1 + arr2)
#运行结果
[

[ 889]]arr1是1行3列的数组,所以arr1自动扩充了行,保持和arr2一致:
[

]
arr2是3行1列的数组,所以arr2自动扩充了列,保持和arr1一致:
[

]
然后 arr1+arr2 得出了上面的结果。
广播规则三

规则三也是两个维度不一样的数组,只不过在不一样的那个维度上,它们的维度数都不是1。
比如:
arr1 = np.random.randint(1, 10, (2, 3))
print(arr1)
#运行结果
[
]

arr2 = np.random.randint(1, 10, (3, 1))
print(arr2)
#运行结果
[

]

print(arr1 + arr2)
#运行结果
#ValueError: operands could not be broadcast together with shapes (2,3) (3,1) arr1是2行3列的数组,arr2是3行1列的数组。
运算时,arr2是可以扩充成3列的,但是arr1无法扩充成3行,因为arr1行的维度和arr2虽然不一样但不等于1。
总结回顾

numpy的广播计算虽然简单,但是对我们的数据分析却很有意义:

[*]提高计算效率:广播计算可以将计算任务分配到每个维度上,从而减少计算时间,提高计算效率。
[*]减少内存占用:广播计算可以在多个维度上同时进行计算,从而减少需要存储的数据量,减少内存占用。
[*]支持并行计算:numpy的广播计算可以支持多线程和多GPU并行计算,从而提高计算速度。
[*]易于并发编程:numpy的广播计算提供了一种并发编程的方式,可以方便地实现多线程和多GPU并行计算。

来源:https://www.cnblogs.com/wang_yb/p/17511013.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【numpy基础】--广播计算