【numpy基础】--广播计算

打印 上一主题 下一主题

主题 753|帖子 753|积分 2259

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

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

比如一维数组和数字运算:
  1. import numpy as np
  2. arr = np.random.randint(1, 10, 5)
  3. print(arr)
  4. #运行结果
  5. [9 8 2 9 7]
  6. print(arr + 1)
  7. #运行结果
  8. [10  9  3 10  8]
  9. print(arr * 2)
  10. #运行结果
  11. [18 16  4 18 14]
复制代码
arr+1 时,1被自动扩充成[1, 1, 1, 1, 1],和 arr 一样结构的数组。
arr*2 时,同样,2被自动扩充成[2, 2, 2, 2, 2],和 arr 一样结构的数组。
二维数组和一维数组运算时:
  1. arr1 = np.random.randint(1, 10, (3, 3))
  2. print(arr1)
  3. #运行结果
  4. [[4 4 3]
  5. [8 2 1]
  6. [5 6 5]]
  7. arr2 = np.random.randint(1, 10, 3)
  8. print(arr2)
  9. #运行结果
  10. [3 9 2]
  11. print(arr1 + arr2)
  12. #运行结果
  13. [[ 7 13  5]
  14. [11 11  3]
  15. [ 8 15  7]]
复制代码
这种情况下,arr2和arr1一样,都是3列,只是行数不一样,所以被自动扩展成:
[[3 9 2]
[3 9 2]
[3 9 2]]
然后再和arr1对应的位置进行加法运算。
广播规则二

规则二两个数组每个维度上的数量都不一样,比如如下两个二维数组的运算:
  1. arr1 = np.random.randint(1, 10, (1, 3))
  2. print(arr1)
  3. #运行结果
  4. [[6 6 7]]
  5. arr2 = np.random.randint(1, 10, (3, 1))
  6. print(arr2)
  7. #运行结果
  8. [[7]
  9. [6]
  10. [2]]
  11. print(arr1 + arr2)
  12. #运行结果
  13. [[13 13 14]
  14. [12 12 13]
  15. [ 8  8  9]]
复制代码
arr1是13的数组,所以arr1自动扩充了行,保持和arr2一致:
[[6 6 7]
[6 6 7]
[6 6 7]]
arr2是31的数组,所以arr2自动扩充了列,保持和arr1一致:
[[7  7  7]
[6  6  6]
[2  2  2]]
然后 arr1+arr2 得出了上面的结果。
广播规则三

规则三也是两个维度不一样的数组,只不过在不一样的那个维度上,它们的维度数都不是1。
比如:
  1. arr1 = np.random.randint(1, 10, (2, 3))
  2. print(arr1)
  3. #运行结果
  4. [[7 9 3]
  5. [1 8 7]]
  6. arr2 = np.random.randint(1, 10, (3, 1))
  7. print(arr2)
  8. #运行结果
  9. [[8]
  10. [6]
  11. [7]]
  12. print(arr1 + arr2)
  13. #运行结果
  14. #ValueError: operands could not be broadcast together with shapes (2,3) (3,1)
复制代码
arr1是23的数组,arr2是31的数组。
运算时,arr2是可以扩充成3的,但是arr1无法扩充成3,因为arr1行的维度和arr2虽然不一样不等于1。
总结回顾

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

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表