首页 > 编程问答 >NumPy 广播数组是否会在二进制运算期间创建?

NumPy 广播数组是否会在二进制运算期间创建?

时间:2024-07-21 11:49:27浏览次数:13  
标签:python numpy array-broadcasting memory-efficient

我有两个 numpy.ndarray 具有不同形状的实例。如果我添加这两个数组,它们之间将发生广播:

import numpy as np

x = np.array([1, 2, 3])
y = np.array([[2,  3,  5],
              [7, 11, 13]])

print(x + y)
# [[ 3  5  8]
#  [ 8 13 16]]

广播数组会被创建吗?也就是说,以下数组会在操作之前 物理地 创建吗? x 对于较小的数组,问题不太明显,但对于较大的数组,差异可能相当大。当隐式广播导致创建新数组时,重复相同的数字可能会浪费大量内存:

[[1, 2, 3],
 [1, 2, 3]]

当广播数组

x = np.random.rand(10000)
y = np.random.rand(10000, 10000)

print(x + y)

实际 使用 创建时,内存浪费变得非常大。 x 如果发生这样的广播,有没有办法避免创建新的数组?如果不是(即未创建新数组),如何实现不匹配形状之间的二元运算?

If such broadcasting occurs, is there a way to avoid creating a new array? If not (i.e. a new array is not created), how are binary operations between mismatching shapes implemented?


NumPy 广播不复制数组

好消息是 NumPy 广播 不会 在内存中创建扩展数组的副本。这对于内存效率和性能至关重要,尤其是在处理大型数组时。

广播如何工作?

NumPy 利用其高效的视图机制来实现广播。它不会复制数据,而是创建数组的“视图”,这些视图具有修改后的步幅信息。步幅描述了在内存中从一个数组元素移动到下一个元素需要跳过的字节数。

在的示例中,当执行 x + y 时,NumPy 不会创建一个新的 10000x10000 数组来存储 x 的扩展版本。相反,它会创建一个具有修改后的步幅的视图,以便在执行加法运算时,它会重复使用 x 中的相同值。

避免创建新数组?

由于广播本身不会创建扩展数组的副本,因此无需采取任何特殊措施来避免内存浪费。NumPy 会自动为处理。

二进制运算的实现方式:

NumPy 使用迭代和索引操作的组合,以及其视图机制,在具有不匹配形状的数组之间执行二进制运算。它会根据广播规则有效地计算最终结果数组的每个元素,而无需创建任何不必要的中间数组。

总而言之,不必担心 NumPy 广播会创建大型中间数组。它是一种经过精心设计的内存效率机制,可以处理不同形状数组之间的运算。

标签:python,numpy,array-broadcasting,memory-efficient
From: 78774337

相关文章

  • 基于python的非平稳时间序列模型
    前言平稳时间序列指的是宽平稳时间序列,就是指时间序列的均值、方差和协方差等一二阶矩存在但不随时间改变,表现为时间的常数。若三个条件有一个不成立,那么就称该序列为非平稳时间序列。包括确定性趋势时间序列和随机性趋势时间序列。要想把非平稳的时间序列转化为平稳的时......
  • 猫头虎 Python知识点分享:pandas--read_csv()用法详解
    ......
  • 使用 Python 绘图
    我有一个.txt文件,从中找到有序对,然后使用numpy和matplotlib绘制图形。例如,这些是我的有序对:[[(4.0,0),(0,6.0)],[(6.0,0),(0,3.0)]](每个子列表代表最终图形中的一条线)图形如下所示:但我想找到两条线之间的交点。如果有更多的线,我怎样才能找到它们......
  • 用python计算形状的距离
    我想计算该图像的最小垂直距离和最大水平距离。就像线条一样。我正在尝试:_,binary_image=cv2.threshold(image,0,255,cv2.THRESH_BINARY)horizontal_distances=np.sum(binary_image==255,axis=1)max_horizontal_distance=np.max(horizontal_distance......
  • 在感知器学习模型的 Python 实现中将数组传递给 numpy.dot()
    我正在尝试将单层感知器分类器的Python实现放在一起。我发现SebastianRaschka的《Python机器学习》一书中的示例非常有用,但我对他的实现的一小部分有疑问。这是代码:importnumpyasnpclassPerceptron(object):"""Perceptronclassifier.Parameters......
  • 带时间戳的 Python 命令行历史记录
    有没有办法记录每个命令的时间?例如,挂钩交互式shell,以便它将相同的内容写入~/.python_history到~/.python_history_timestamps但带有时间戳?我正在跟踪我白天所做的事情并将其放入我的日历中。为了帮助回溯,我使用了firefox历史记录、Dropbox活动、一个......
  • 在 python3 中迭代字典键时无法删除它:“RuntimeError:字典在迭代期间更改了大小”
    我试图在迭代字典时从字典中删除一个键。从字典中删除键时,我得到:RuntimeError:dictionarychangedsizeduringiteration我的代码:mydict={'one':1,'two':2,'three':3,'four':4}fork,vinmydict.items():ifk=='two'......
  • Python pyTelegramBotAPI:设置不受循环影响的变量
    我想创建一个基本上是布尔值的变量(无论机器人是否工作)。但是,当使用TeleBot.polling()时,脚本开始无限循环,所以如果我在代码开头设置一个变量就像:is_bot_working=True,变量将始终为真,反之亦然。那么,我应该如何设置一个不受循环影响的变量?这就是代码:impor......
  • 编解码器无法解码位置 2-3 中的字节:截断的 \UXXXXXXXX 转义 (Python QREADER)
    我正在尝试pythonqreader模块,但每次我尝试运行它时,我都会收到SyntaxError:(unicodeerror)'unicodeescape'codeccan'tDecodebytesinposition2-3:truncated\UXXXXXXXXescapeerror.fromqreaderimportQReaderfromcv2importQRCodeDetector,imreadfrompyz......
  • Python 工程师对 3D 高斯溅射的介绍(第 1 部分)
    从Python工程师的角度理解和编写GaussianSplatting欢迎来到雲闪世界。2023年初,来自法国蔚蓝海岸大学和马克斯普朗克信息研究所的作者发表了一篇题为“用于实时场渲染的3D高斯溅射”的论文。¹该论文展示了实时神经渲染的重大进步,超越了NeRF等先前方法的实用性。²......