简单总结广播机制

简介: 简单总结广播机制

这部分对矩阵运算有着特殊的影响,包括numpy等。

当两个维度相同的数组相加时,实际就时对应元素相加,很容易想象。

如下:

1453c01f47c841f89dde871c8b580336.png

但是如果维度不同的!!!接下来进行讨论:定义放上来很难懂,我就直接结合图进行理解

问题描述:假设我们有两个矩阵维度分维度不同。正常情况下,两个矩阵直接相加应该是元素对应相加,但是例子中维度不同元素难以对应,就会出现问题。

此时,广播机制的作用就体现了出来,他会将其中维度较小的进行x或y方向的复制,然后相加

图1:y方向的复制

f2296edc36d54ad79b50e27395bb8440.png

图2:x方向的复制

bf6b2a6ee041427ebd8fafbf908c72e5.png

通过上面看,两个矩阵还是有一定规律的,假设,维度较大的为(w, h),那么较小的为(1, h)或(w, 1)即较小维度的矩阵满足其其中一个维度为1,其余维度与较大维度矩阵的维度一致。这也是广播机制应用的条件。其余不满足此条件的无法使用广播机制。

假设我们有下面一段代码:

import torch
l1 = torch.as_tensor([[1, 2], [3, 4], [5, 6]])
l2 = torch.as_tensor([[7, 8]])
print(l1.shape)
print(l2.shape)
print(l1 + l2)

因为l1维度为(3, 2),l2维度为(1, 2)。l2为维度较小的矩阵,其中第一维度为1,第二维度与l1相同,满足广播机制触发条件,因此可以相加。结果如下:

torch.Size([3, 2])
torch.Size([1, 2])
tensor([[ 8, 10],
        [10, 12],
        [12, 14]])

就是类似上面图2的过程

这是二维上面的,如果是三维的可以吗?一段代码进行尝试:

l1 = torch.as_tensor([[[1, 2], [3, 4], [5, 6]]])
l2 = torch.as_tensor([[[7, 8]], [[9, 10]]])
print(l1.shape)
print(l2.shape)
print(l1 + l2)
print((l1 + l2).shape)

l1维度是(1, 3, 2),l2维度是(2, 1, 2)。运行以下代码,是可以通过的!!!

torch.Size([1, 3, 2])
torch.Size([2, 1, 2])
tensor([[[ 8, 10],
         [10, 12],
         [12, 14]],
        [[10, 12],
         [12, 14],
         [14, 16]]])
torch.Size([2, 3, 2])

**从上面看,我们三维度的广播机制有些不太符合我们上面总结的广播机制应用条件,但是可以将三维拆开进行理解。**如上面可以拆分为两组二维,分别是l1_1(1,2),l2_1(2, 2)和l1_2(3, 2),l2_2(1, 2),后面与二维操作一致。

相关文章
|
4天前
|
存储 数据处理 Python
NumPy数组运算:元素级与广播机制剖析
【4月更文挑战第17天】NumPy是Python数值计算库,提供元素级运算和广播机制。元素级运算针对数组每个元素单独计算,如加法、减法等;广播机制允许不同形状数组间运算,通过扩展小数组形状匹配大数组。了解这两点能帮助更好地运用NumPy进行数值计算和数据处理。
|
4天前
|
算法 数据处理 数据安全/隐私保护
深入NumPy的随机数生成机制
【4月更文挑战第17天】本文探讨了NumPy的随机数生成机制,强调了伪随机数在科学计算中的重要性。NumPy提供了多种生成器,如`RandomState`(基于Mersenne Twister)、`Generator`(灵活且强大)和`default_rng`(推荐,基于PCG64)。生成随机数涉及初始化生成器、设置种子和调用相关方法。关注生成器的质量和性能,遵循最佳实践,如避免硬编码种子、使用最新NumPy版本以及选择合适的生成器和分布,能有效提升数据处理效率和准确性。
|
8月前
|
存储 JavaScript 索引
[Eigen中文文档] 归约、访问者和广播
本文介绍了Eigen的归约、访问者和广播,以及它们如何与矩阵和数组一起使用。
78 0
|
Python
numpy广播机制
numpy广播机制
58 0
|
机器学习/深度学习 存储 索引
NumPy中的广播:对不同形状的数组进行操作
NumPy中的广播:对不同形状的数组进行操作
86 0
NumPy中的广播:对不同形状的数组进行操作
|
Python
Numpy中的广播机制,你确定正确理解了吗?
Numpy其提供了大量常用的数值计算功能,当然这些数值计算函数大多依赖于其核心的数据结构:ndarray,也就是N维数组。而关于这个ndarray,有一个重要特性是广播机制,也正是整个广播机制,使得Numpy中的数值计算功能更加丰富和强大。那么问题来了,你是否已经正确理解了这个广播机制呢?
122 0
Numpy中的广播机制,你确定正确理解了吗?
|
存储 Python
numpy的使用说明(五):数组的广播机制、数组元素的底层存储(一)
numpy的使用说明(五):数组的广播机制、数组元素的底层存储(一)
numpy的使用说明(五):数组的广播机制、数组元素的底层存储(一)
|
存储 C语言 索引
numpy的使用说明(五):数组的广播机制、数组元素的底层存储(二)
numpy的使用说明(五):数组的广播机制、数组元素的底层存储(二)
numpy的使用说明(五):数组的广播机制、数组元素的底层存储(二)