浅谈numpy广播机制

作者:红烧code 时间:2023-08-25 22:07:51 

Broadcast

广播是numpy对不同形状(shape)的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行。如果两个数组a和b形状相同,即a.shape==b.shape为True时,那么a*b的结果就是a与b数组的对应位相乘。这要求维数相同,并且各维度的长度相同。

例如:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a*b)

# 运行结果为array([4,10,18])

最简单的广播机制

当一个常数与一个array对象相乘时,这时就会触发numpy的广播机制

import numpy as np

a = np.array([1, 2, 3])
print(a*2)

# 运行结果为array([2,4,6])

或许你把这当作理所应当,但是这就是通过广播机制来实现的。

浅谈numpy广播机制

稍微复杂的广播机制

import numpy as np
a = np.array([[0, 0, 0],
             [10, 10, 10],
             [20, 20, 20],
             [30, 30, 30]])
b = np.array([1, 2, 3])
print(a+b)

输出结果是:

array([[ 1,  2,  3],
       [11, 12, 13],
       [21, 22, 23],
       [31, 32, 33]])

初学者可能认为这样的运算会报错,但是这的确是正确的,原因还是广播机制

广播机制到底做了什么

我们观察上面这个稍显复杂的例子:

a.shape=(4,3)b.shape=(1,3),两个矩阵axis=1的数据宽度是相同的,但是axis=0的数据宽度不一样,并且b.shape[0]=1,这就是广播机制的触发条件,这时numpy会把b沿axis=0的方向复制4份,即形状变成(4, 3),与a的一致,接下来就是对应位相加即可。

如下图:

浅谈numpy广播机制

一个典型的错误案例

浅谈numpy广播机制

import numpy as np
a = np.array([[0, 0, 0],
             [10, 10, 10],
             [20, 20, 20],
             [30, 30, 30]])
b = np.array([0, 1, 2, 3])
a+b

提示无法进行广播:

浅谈numpy广播机制

能否广播必须从axis的最大值向最小值看去,依次对比两个要进行运算的数组的axis的数据宽度是否相等,如果在某一个axis下,一个数据宽度为1,另一个数据宽度不为1,那么numpy就可以进行广播;但是一旦出现了在某个axis下两个数据宽度不相等,并且两者全不为1的状况,就无法广播。

一个正确的经典示例

import numpy as np
a = np.arange(6).reshape((2, 3, 1))
b = np.arange(6).reshape((1, 3, 2))
print(a)
print(b)
print(a+b)
print((a+b).shape)

结果:

a是:
array([[[0],
        [1],
        [2]],

       [[3],
        [4],
        [5]]])
        
b是:
array([[[0, 1],
        [2, 3],
        [4, 5]]])
        
a+b是:
array([[[ 0,  1],
        [ 3,  4],
        [ 6,  7]],

       [[ 3,  4],
        [ 6,  7],
        [ 9, 10]]])

运算过程是:

1不等于2,所以对a的axis=2进行广播,a变为

array([[[0,0],
       [1,1],
       [2,2]],

[[3,3],
       [4,4],
       [5,5]]])

axis=1时3等于3,不进行广播

axis=0时,2不等于1,所以对b的axis=0进行广播,b变为:

array([[[0, 1],
       [2, 3],
       [4, 5]],

[[0, 1],
       [2, 3],
       [4, 5]]])

最后a、b的shape变为一样,运算结果即为:

array([[[ 0,  1],
       [ 3,  4],
       [ 6,  7]],

[[ 3,  4],
       [ 6,  7],
       [ 9, 10]]])

一种更便捷的计算方式

注:np.newaxis表示增加一个数据宽度为1的维度

因此a[:, np.newaxis] = array([[0],[10],[20],[30]])

import numpy as np
a = np.array([0, 10, 20, 30])
b = np.array([0, 1, 2])
a[:, np.newaxis]+b

结果:

array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])

广播过程:

浅谈numpy广播机制

来源:https://blog.csdn.net/qq_51352578/article/details/125074264

标签:numpy,广播机制
0
投稿

猜你喜欢

  • Django开发RESTful API实现增删改查(入门级)

    2022-05-17 02:36:53
  • SQL Server 置疑、可疑、正在恢复等情况分析

    2012-01-05 18:51:59
  • Python实现一个简单的递归下降分析器

    2022-10-05 16:23:13
  • mysql优化配置参数

    2024-01-27 11:25:35
  • Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】

    2023-03-18 02:18:43
  • c#如何利用定时器自动备份数据库详解

    2024-01-27 12:11:33
  • Python2.x中文乱码问题解决方法

    2023-09-20 14:35:35
  • Python迭代器定义与简单用法分析

    2022-10-24 02:44:29
  • SQL Transcation的一些总结分享

    2012-08-21 10:21:28
  • Django-xadmin+rule对象级权限的实现方式

    2023-02-20 17:08:08
  • Python生成rsa密钥对操作示例

    2021-08-25 03:43:31
  • 用Python+OpenCV对比图像质量的几种方法

    2022-06-28 10:57:59
  • 十条建议帮你提高Python编程效率

    2021-07-18 02:55:54
  • MySQL约束与索引概念详解

    2024-01-28 17:06:39
  • 使用JavaScript实现旋转的彩圈特效

    2023-08-22 16:34:53
  • python保存文件方法小结

    2021-09-09 04:13:59
  • js 动态加载事件的几种方法总结

    2024-04-22 22:24:42
  • Python字符串大小写转换拼接删除空白

    2023-01-24 13:08:01
  • mysql 忘记root密码

    2010-12-14 14:50:00
  • SQL0290N表空间状态问题:停顿的独占处理

    2008-12-26 17:24:00
  • asp之家 网络编程 m.aspxhome.com