Numpy广播域的理解

作者:算力鬼才信 时间:2023-03-11 14:37:11 

NumPy广播(Broadcast),广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。

不同形状指的是,大小不同当然不是指的维度,但是要求数组各维度的长度相同

例如:

arr = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
print(arr)
arr2 = np.array([1,2,3])

Numpy广播域的理解

arr是4*3的二维数组 arr2 是1*3的一维数组 ,二维数组中的一维数组 长度是3 ,而一维数组的长度也是三,所以只有满足这样的条件才可以进行计算。

如果想要知道他们是如何进行计算的请看下面的图片

arr = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
print(arr)
arr2 = np.array([1,2,3])
print(arr2)
print(arr*arr2)

Numpy广播域的理解

我们知道arr 和arr 数组的维度是不相同的,如果在普通的运算中,如果我们想对它们元素到元素之间进行相乘或者相加减,显然是不可能的,但是在numpy中是可以对不同维度的数组进行乘除加减操作的,因为numpy中的数组具有广播功能。低维度的数组会扩展到和多维数组相同大小

我们可以这样认为,arr2是一维数组,它和二维数组arr 进行乘法运算,arr2 中的每一元素依次会和二维数组的每一个元素相乘。但是对广播来说不能这样简单认为:

arr2

1

2

3

arr2经过广播后

1

2

3

1

2

3

1

2

3

1

2

3

arr数组

0

2

6

3

8

15

6

14

24

9

20

22

广播操作具有延伸性,它会将低维度的数组,延伸成为和高维度一样大小的数组,然后在对他们进行乘除加减操作。

有的朋友会问,二维数组乘以一维数组它们得到的结果是多大维度的。

Numpy广播域的理解

显然结果是二维数组,如果测试该数组的维度,请将该数组点上一个 ndim 方法名 arr.ndim

NumPy广播的规则

  • 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。

  • 输出数组的形状是输入数组形状的各个维度上的最大值。

刚才看到 输入数组 arr 是 4 x 3 arr2 是 1 x 3 ,输出数组 result 是 4 x 3 最大值是不是 4 x 3 啊

  • 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。

arr 是二维,arr2是一维,我们需要拿arr中的一维数组和arr2比较观察他们的长度(行元素个数)是否相同,或者arr2中只有一个元素,才能进行计算否则会报错

两个输入数组对应维度的元素个数相同:

arr = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
arr2 = np.array([2,3,4])

低维度的元素个数(长度)为 1

arr = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
arr2 = np.array([2])

报错案例: 低维度的数组多一个元素或者少一个元素都不行,但排除元素个数为1的可能性

低维度数组的元素少一个
arr = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
arr2 = np.array([2,3])
报错提示:
ValueError: operands could not be broadcast together with shapes (4,3) (2,)
低维度数组的元素多一个
arr = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
arr2 = np.array([2,3,4,5])
报错提示:ValueError: operands could not be broadcast together with shapes (4,3) (4,)
正确 : 低维度数组维度的值(元素个数)为1个
arr = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
arr2 = np.array([3])
result = arr*arr2
结果:
[[ 1  2  3]            arr
[ 4  5  6]
[ 7  8  9]
[10 11 12]]

[3]                    arr2

[[ 3  6  9]           result
[12 15 18]
[21 24 27]
[30 33 36]]

当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。

简单理解:对两个数组,分别比较他们的每一个维度(若其中一个数组没有当前维度则忽略),满足:

  • 数组拥有相同形状。

  • 当前维度的值相等。

  • 当前维度的值有一个是 1。

numpy中的数组具有广播性,广播性就是延伸性,比较低的维度数组会延伸到和维度较大的数组一样的大小,这里的低维度指的是一维数组,如果是其它维度就要做操作的两个数组的维数相同和各维度的长度是否相同不同则不可以进行广播操作。numpy只针对一维数组且各维度的长度要相同,或者其中一个数组只有一个元素。

来源:https://blog.csdn.net/weixin_59131972/article/details/129707166

标签:Numpy,广播域
0
投稿

猜你喜欢

  • Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作

    2022-05-06 14:26:39
  • 巧用局部变量提升javascript性能

    2024-04-18 09:33:19
  • Microsoft SQL Server 2012 数据库安装图解教程

    2024-01-13 18:20:25
  • 写了一个小巧的jquery拾色工具

    2009-12-21 14:22:00
  • python实现修改固定模式的字符串内容操作示例

    2023-05-13 21:44:04
  • python使用pandas读xlsx文件的实现

    2021-01-21 05:00:10
  • python获取list下标及其值的简单方法

    2023-09-18 08:30:56
  • 树莓派使用python-librtmp实现rtmp推流h264的方法

    2021-10-24 13:50:15
  • 一文了解Python并发编程的工程实现方法

    2023-12-26 13:54:36
  • oracle ORA-01114、ORA-27067错误解决方法

    2023-07-15 18:36:39
  • Tab(选项卡)的产品设计原则及应用[译]

    2009-07-09 19:05:00
  • Mysql支持的数据类型(列类型总结)

    2024-01-28 01:31:31
  • mysql 修改用户密码图文介绍

    2024-01-21 13:39:51
  • 在弹出窗口用POST提交数据

    2010-02-24 09:39:00
  • python numpy.linalg.norm函数的使用及说明

    2022-05-27 10:20:32
  • 瀑布流布局浅析

    2011-09-16 20:18:09
  • JavaScript运动框架 多值运动(四)

    2023-09-08 01:44:51
  • 使用python如何删除同一文件夹下相似的图片

    2021-10-19 02:52:23
  • php字符串函数 str类常见用法示例

    2024-05-11 10:01:43
  • MySQL中实现高性能高并发计数器方案(例如文章点击数)

    2024-01-19 00:43:09
  • asp之家 网络编程 m.aspxhome.com