经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
详解Numpy中的广播原则/机制
来源:jb51  时间:2018/9/25 19:05:43  对本文有异议

广播的原则

如果两个数组的后缘维度(从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失维度和(或)轴长度为1的维度上进行。

在上面的对arr每一列减去列平均值的例子中,arr的后缘维度为3,arr.mean(0)后缘维度也是3,满足轴长度相符的条件,广播会在缺失维度进行。

这里有点奇怪的是缺失维度不是axis=1,而是axis=0,个人理解是缺失维度指的是两个arr除了轴长度匹配的维度,在上面的例子中,正好是axis=0。这块欢迎指正

arr.mean(0)沿着axis=0广播,可以看作是把arr.mean(0)沿着竖直方向复制4份,即广播的时候arr.mean(0)相当于一个shape=(4,3)的数组,数组的每一行均相同,均为arr.mean(0)

为了了解这个原则,首先我们来看一组例子:

  1. # 数组直接对一个数进行加减乘除,产生的结果是数组中的每个元素都会加减乘除这个数。
  2. In [12]: import numpy as np
  3. In [13]: a = np.arange(1,13).reshape((4, 3))
  4. In [14]: a * 2
  5. Out[14]: array([[ 2, 4, 6],
  6.     [ 8, 10, 12],
  7.     [14, 16, 18],
  8.     [20, 22, 24]])
  9. # 接下来我们看一下数组与数组之间的计算
  10. In [17]: b = np.arange(12,24).reshape((4,3))
  11. In [18]: b
  12. Out[18]: array([[12, 13, 14],
  13.     [15, 16, 17],
  14.     [18, 19, 20],
  15.     [21, 22, 23]])
  16. In [19]: a + b
  17. Out[19]: array([[13, 15, 17],
  18.     [19, 21, 23],
  19.     [25, 27, 29],
  20.     [31, 33, 35]])
  21. In [20]: c = np.array([1,2,3])
  22. In [21]: a+c
  23. Out[21]: array([[ 2, 4, 6],
  24.     [ 5, 7, 9],
  25.     [ 8, 10, 12],
  26.     [11, 13, 15]])
  27. In [22]: d = np.arange(10,14).reshape((4,1))
  28. In [23]: d
  29. Out[23]: array([[10],
  30.     [11],
  31.     [12],
  32.     [13]])
  33. In [24]: a + d
  34. Out[24]: array([[11, 12, 13],
  35.     [15, 16, 17],
  36.     [19, 20, 21],
  37.     [23, 24, 25]])
  38. # 从上面可以看出,和线性代数中不同的是,m*n列的m行的一维数组或者n列的一维数组也是可以计算的。

这是为什么呢?这里要提到numpy的广播原则:

如果两个数组的后缘维度(从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失维度和(或)轴长度为1的维度上进行。

在上面的代码中,a的维度是(4,3),c的维度是(1,3);d的维度是(4,1)。所以假设有两个数组,第一个的维度是(x_1, y_1, z_1),另一个数组的维度是(x_2, y_2, z_2),要判断这两个数组能不能进行计算,可以用如下方法来判断:

  1. if z_1 == z_2 or z_1 == 1 or z_2 == 1:
  2.  if y_1 == y_2 or y_1 == 1 or y_2 == 1:
  3.   if x_1 == x_2 or x_1 == 1 or x_2 == 1:
  4.    可以运算
  5.   else:
  6.    不可以运算
  7.  else:
  8.   不可以运算
  9. else:
  10.  不可以运算

这里需要注意:(3,3,2)和(3,2)是可以运算的,因为对于二维数组(3,2)也可以表示为(1,3,2),套用上述的规则是完全适用的,同理:(4,2,5,4)和(2,1,4)也是可以进行运算的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号