【numpy基础】--广播计算

numpy,基础,广播,计算 · 浏览次数 : 71

小编点评

**numpy广播计算** **什么是广播计算?** 广播计算是在多维数组上执行计算的有效方法。它可以将计算任务分配到每个维度上,并使用数据共享和同步进行加速。 **广播计算的规则** 1. **维度数不相同:**如果两个数组的维度数不相同,则小维度数组的形状将在最左边补1。 2. **形状不匹配:**如果两个数组的形状在任何一个维度上都不匹配,则数组的形状会沿着维度为1的维度扩展以匹配另一个数组的形状。 3. **维度不匹配并且没有任何维度等于1:**如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于1,则会引发异常。 **广播计算的应用** * **数值计算:**求解大规模的非线性方程组。 * **科学计算:**模拟和预测自然现象。 * **机器学习:**分布式训练和推理。 **示例** ```python import numpy as nparr # 创建随机数组 arr = np.random.randint(1, 10, (5, 3)) # 打印数组 print(arr) # 广播加法 arr + 1 # 广播乘法 arr * 2 # 打印结果 print(arr) ``` **结果** ``` [[4 4 3] [8 2 1] [5 6 5]] [18 16 4 18 14] ``` **总结** 广播计算是一种高效的计算方法,可以将计算任务分配到每个维度上,并使用数据共享和同步进行加速。它在数值计算、科学计算、机器学习等领域有广泛的应用。

正文

numpy的广播计算是指在多维数组上进行的一种高效计算方式。
它可以将计算任务分配到每个维度上,并且可以在计算过程中进行数据共享和同步,从而提高计算效率和精度。

广播计算在数值计算、科学计算、机器学习等领域都有广泛的应用。
例如,在数值计算中,广播计算可以用于求解大规模的非线性方程组;在科学计算中,广播计算可以用于模拟和预测自然现象;在机器学习中,广播计算可以用于分布式训练和推理等场景。

numpy中广播计算遵循3个严格的规则:

  1. 如果两个数组的维度数不相同,小维度数组的形状将会在最左边补1
  2. 如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度为1的维度扩展以匹配另一个数组的形状
  3. 如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于1,那么会引发异常

广播规则一

比如一维数组和数字运算:

import numpy as np

arr = np.random.randint(1, 10, 5)
print(arr)
#运行结果
[9 8 2 9 7]

print(arr + 1)
#运行结果
[10  9  3 10  8]

print(arr * 2)
#运行结果
[18 16  4 18 14]

arr+1 时,1被自动扩充成[1, 1, 1, 1, 1],和 arr 一样结构的数组。
arr*2 时,同样,2被自动扩充成[2, 2, 2, 2, 2],和 arr 一样结构的数组。

二维数组和一维数组运算时:

arr1 = np.random.randint(1, 10, (3, 3))
print(arr1)
#运行结果
[[4 4 3]
 [8 2 1]
 [5 6 5]]

arr2 = np.random.randint(1, 10, 3)
print(arr2)
#运行结果
[3 9 2]

print(arr1 + arr2)
#运行结果
[[ 7 13  5]
 [11 11  3]
 [ 8 15  7]]

这种情况下,arr2arr1一样,都是3列,只是行数不一样,所以被自动扩展成:

[[3 9 2]
[3 9 2]
[3 9 2]]

然后再和arr1对应的位置进行加法运算。

广播规则二

规则二两个数组每个维度上的数量都不一样,比如如下两个二维数组的运算:

arr1 = np.random.randint(1, 10, (1, 3))
print(arr1)
#运行结果
[[6 6 7]]

arr2 = np.random.randint(1, 10, (3, 1))
print(arr2)
#运行结果
[[7]
 [6]
 [2]]

print(arr1 + arr2)
#运行结果
[[13 13 14]
 [12 12 13]
 [ 8  8  9]]

arr113的数组,所以arr1自动扩充了行,保持和arr2一致:

[[6 6 7]
[6 6 7]
[6 6 7]]

arr231的数组,所以arr2自动扩充了列,保持和arr1一致:

[[7 7 7]
[6 6 6]
[2 2 2]]

然后 arr1+arr2 得出了上面的结果。

广播规则三

规则三也是两个维度不一样的数组,只不过在不一样的那个维度上,它们的维度数都不是1
比如:

arr1 = np.random.randint(1, 10, (2, 3))
print(arr1)
#运行结果
[[7 9 3]
 [1 8 7]]

arr2 = np.random.randint(1, 10, (3, 1))
print(arr2)
#运行结果
[[8]
 [6]
 [7]]

print(arr1 + arr2)
#运行结果
#ValueError: operands could not be broadcast together with shapes (2,3) (3,1) 

arr123的数组,arr231的数组。
运算时,arr2是可以扩充成3的,但是arr1无法扩充成3,因为arr1行的维度和arr2虽然不一样不等于1

总结回顾

numpy的广播计算虽然简单,但是对我们的数据分析却很有意义:

  1. 提高计算效率:广播计算可以将计算任务分配到每个维度上,从而减少计算时间,提高计算效率。
  2. 减少内存占用:广播计算可以在多个维度上同时进行计算,从而减少需要存储的数据量,减少内存占用。
  3. 支持并行计算:numpy的广播计算可以支持多线程和多GPU并行计算,从而提高计算速度。
  4. 易于并发编程:numpy的广播计算提供了一种并发编程的方式,可以方便地实现多线程和多GPU并行计算。

与【numpy基础】--广播计算相似的内容:

【numpy基础】--广播计算

`numpy`的广播计算是指在多维数组上进行的一种高效计算方式。 它可以将计算任务分配到每个维度上,并且可以在计算过程中进行数据共享和同步,从而提高计算效率和精度。 广播计算在数值计算、科学计算、机器学习等领域都有广泛的应用。 例如,在数值计算中,广播计算可以用于求解大规模的非线性方程组;在科学计算

【numpy基础】--数组简介

`NumPy`(Numerical Python)是一个`Python`库,主要用于高效地处理多维数组和矩阵计算。它是科学计算领域中使用最广泛的一个库。 在`NumPy`中,**数组**是最核心的概念,用于存储和操作数据。 `NumPy`数组是一种多维数组对象,可以存储相同类型的元素,它支持高效的数

【numpy基础】--基础操作

`numpy`作为一个强大的数值计算库,提供了对多维数组的很多便捷操作。 承接上一篇数组的创建,本篇主要介绍一些数组的基本操作。 # 1. 子数组 首先介绍获取子数组的方法,提取已有数据的一部分来参与计算是比较常用的功能。 对于一维数组,提取子数组:`arr[start:stop:step]` 1.

【numpy基础】--通用计算

`numpy`提供了简单灵活的接口,用于优化数据数组的计算。 通用计算最大的优势在于通过向量化操作,将循环推送至`numpy`之下的编译层,从而取得更快的执行效率。 `numpy`的通用计算让我们计算数组时就像计算单独一个变量一样, 不用写循环去遍历数组中的各个元素。 比如,对于一般的`python

【numpy基础】--聚合计算

上一篇介绍的**通用计算**是关于多个`numpy`数组的计算, 本篇介绍的**聚合计算**一般是针对单个数据集的各种统计结果,同样,使用**聚合函数**,也可以避免繁琐的循环语句的编写。 # 元素的和 数组中的元素求和也就是合计值。 ## 调用方式 **聚合计算**有两种调用方式,一种是面向对象的

【numpy基础】--数组过滤

在`numpy`中,数组可以看作是一系列数值的有序集合,可以通过下标访问其中的元素。处理数组的过程中,经常需要用到数组过滤功能。 过滤功能可以在处理数据时非常有用,因为它可以使数据更加干净和可读性更强。例如,在进行数据分析时,通常需要去除异常值,过滤掉不必要的元素可以使数据更加易于分析和处理。 `n

【numpy基础】--数组索引

数组索引是指在`numpy`数组中引用特定元素的方法。`numpy`的数组索引又称为`fancy indexing`,比其他编程语言的索引强大很多。 # 1. 选取数据 numpy的索引除了像其他语言一样选择一个元素,还可以间隔着选取多个元素,也可以用任意的顺序选取元素。 比如一维数组: ```py

【numpy基础】--数组排序

`numpy` 数组通常是用于数值计算的多维数组,而排序功能可以快速、准确地对数据进行排序,从而得到更加清晰、易于分析的结果。 在数据分析和处理过程中,常常需要对数据进行排序,以便更好地理解和发现其中的规律和趋势。 排序会应用在很多场景中,比如: 1. 数据分类:将数据按照一定的特征进行分类,可以通

【numpy基础】--结构化

目前为止,介绍的`numpy`数组基本都是关于数值的,其实,`numpy`本身就是一个用于数值计算的基础库。 不过,除了数值计算之外,`numpy`也能够支持**结构化数组**。 # 1. 关联不同类型数据 `numpy`的数组为了提高计算性能,要求数组的数据类型要一致。但是现实情况下,我们经常遇到

【numpy基础】--目录(完结)

# 概述 NumPy是一个开源的科学计算库,它提供了高效的数值计算和数组操作功能,主要包括: * 多维数组的创建、操作和索引。 * 数组的切片、拼接和转置。 * 数组的乘法、除法、求导、积分、对数等基本运算。 * 数组的逐元素操作、求平均值、中位数、众数等统计量。 * 数组作为列表、元组等数据类型进