NumPy中的广播:对不同形状的数组进行操作

简介: NumPy中的广播:对不同形状的数组进行操作

NumPy是用于Python的科学计算库。它是数据科学领域中许多其他库(例如Pandas)的基础。

在机器学习领域,无论原始数据采用哪种格式,都必须将其转换为数字数组以进行计算和分析。因此,需要对阵列进行快速,鲁棒和准确的计算,以对数据执行有效的操作。

NumPy是科学计算的主要库,因为它提供了我们刚刚提到的功能。在本文中,我们重点介绍正在广播的NumPy的特定类型的操作。

广播描述了在算术运算期间如何处理具有不同形状的数组。我们将通过示例来理解和练习广播的细节。

我们首先需要提到数组的一些结构特性。

维度:索引的数量

形状:数组在每个维度上的大小

大小:数组中元素的总数。

尺寸的计算方法是将每个维度的尺寸相乘。我们来做一个简单的例子。

importnumpyasnparr=np.random.randint(10, size=(3,4))
arrarray([[7, 8, 9, 9],
        [6, 0, 2, 9],
        [3, 0, 8, 0]])
arr.ndim2arr.shape(3,4)
arr.size12

使用NumPy进行的算术运算通常按元素进行。例如,当我们相加两个数组时,在相同位置的元素被计算。

a=np.array([1,2,3,4])
b=np.array([1,1,1,1])
a+barray([2, 3, 4, 5])

因为操作是按元素执行的,所以数组必须具有相同的形状。广播在这种情况下提供了一些灵活性,因此可以对不同形状的数组进行算术运算。

但是有一些规则必须满足。我们不能只是广播任何数组。在下面的例子中,我们将探索这些规则以及广播是如何发生的。

最简单的广播形式发生在数组和标量相加时。

a=np.array([1,2,3,4])
b=1a+barray([2, 3, 4, 5])

做加法操作时,假设b是一个有4个整数为1的数组。

640.png

图中所示的拉伸只是概念上的。NumPy实际上并不对标量进行复制,以匹配数组的大小。相反,在加法中使用原始标量值。因此,广播操作在内存和计算方面非常高效。

我们还可以对高维数组和一个标量进行加法操作。在这种情况下,广播发生在所有坐标轴上。在下面的示例中,我们有一个形状为(3,4)的二维数组。标量被加到数组的所有元素中。

A=np.random.randint(5, size=(3, 4))
B=2print(A)
print("--------")
print(A+B)
[[0100]
  [0243]
  [0121]]
--------[[2322]
  [2465]
  [2343]]

本例中的广播如下:

640.png

广播规则

我们不能只是在算术运算中广播任何数组。如果阵列的尺寸兼容,则广播适用。在以下情况下被视作两个维度兼容:

每个维度的大小相等,或其中之一是1。

换句话说,如果维度中的大小不相等,则其中之一必须为1。

考虑以下示例。我们有几个二维数组。二维尺寸相等。但是,它们中的一个在第一维度上的大小为3,而另一个在大小上为1。因此,第二个数组将在广播中广播。

640.png

两个数组在两个维度上的大小可能不同。在这种情况下,将广播尺寸为1的尺寸以匹配该尺寸中的最大尺寸。

下图说明了这种情况的示例。第一个数组的形状是(4,1),第二个数组的形状是(1,4)。由于在两个维度上都进行广播,因此所得数组的形状为(4,4)。

640.png

当对两个以上的数组进行算术运算时,也会发生广播。同样的规则也适用于此。每个尺寸的大小必须相等或为1。

A=np.random.randint(5, size=(1,3,4))
B=np.random.randint(5, size=(2,1,4))
C=np.random.randint(5, size=(2,3,1))

所有这些阵列都是三维的。如果特定维度的大小与其他数组不同,则必须为1。

如果我们将这三个数组加在一起,则结果数组的形状将为(2,3,4),因为广播的尺寸为1的尺寸与该尺寸中的最大尺寸匹配。

print((A+B+C).shape)
(2, 3, 4)

最后做一个简单总结

我们介绍了NumPy中广播的想法。使用数组执行算术计算时,它提供了灵活性。

广播还可以通过防止NumPy不必要地复制值来使某些操作在存储和计算方面更加高效。

感谢您的阅读。如果您有任何反馈意见,请告诉我。

目录
相关文章
|
6天前
|
计算机视觉 Python
PIL图像转换为Numpy数组:技术与案例详解
本文介绍了如何将PIL图像转换为Numpy数组,以便利用Numpy进行数学运算和向量化操作。首先简要介绍了PIL和Numpy的基本功能,然后详细说明了转换过程,包括导入库、打开图像文件、使用`np.array()`或`np.asarray()`函数进行转换,并通过打印数组形状验证转换结果。最后,通过裁剪、旋转和缩放等案例展示了转换后的应用,以及如何将Numpy数组转换回PIL图像。此外,还介绍了处理base64编码图像的完整流程。
19 4
|
2月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
96 10
|
2月前
|
Python
Numpy学习笔记(四):如何将数组升维、降维和去重
本文介绍了如何使用NumPy库对数组进行升维、降维和去重操作。
57 1
|
2月前
|
Python
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
NumPy库中的`np.concatenate`和`np.append`函数,它们分别用于沿指定轴拼接多个数组以及在指定轴上追加数组元素。
58 0
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
|
2月前
|
Python
使用 NumPy 进行数组操作的示例
使用 NumPy 进行数组操作的示例
43 2
|
2月前
|
索引 Python
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧1
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
122 4
|
2月前
|
机器学习/深度学习 并行计算 调度
CuPy:将 NumPy 数组调度到 GPU 上运行
CuPy:将 NumPy 数组调度到 GPU 上运行
127 1
|
3月前
|
Python
numpy | 插入不定长字符数组测试OK
本文介绍了如何在numpy中创建和操作不定长字符数组,包括插入和截断操作的测试。
|
3月前
|
API Python
Numpy 数组的一些集合操作
Numpy 数组的一些集合操作
44 0
|
3月前
|
编译器 Linux API
基于类型化 memoryview 让 Numpy 数组和 C 数组共享内存
基于类型化 memoryview 让 Numpy 数组和 C 数组共享内存
52 0