【深度学习】NumPy详解(四):4、数组广播;5、排序操作

2024-07-29 21:33:24 浏览数 (2)

一、前言

Python是一种高级编程语言,由Guido van Rossum于1991年创建。它以简洁、易读的语法而闻名,并且具有强大的功能和广泛的应用领域。Python具有丰富的标准库和第三方库,可以用于开发各种类型的应用程序,包括Web开发、数据分析、人工智能、科学计算、自动化脚本等。

Python本身是一种伟大的通用编程语言,在一些流行的库(numpy,scipy,matplotlib)的帮助下,成为了科学计算的强大环境。本系列将介绍Python编程语言和使用Python进行科学计算的方法,主要包含以下内容:

  • Python:基本数据类型、容器(列表、元组、集合、字典)、函数、类
  • Numpy:数组创建、数组操作、数组数学、广播
  • Matplotlib:绘图风格和类型、图表自定义、多子图和布局
  • IPython:创建笔记本、典型工作流程

二、实验环境

matplotlib

3.5.3

numpy

1.21.6

python

3.7.16

  • 运行下述命令检查Python版本
代码语言:javascript复制
 python --version 
  • 运行下述代码检查Python、NumPy、Matplotlib版本
代码语言:javascript复制
import sys
import numpy as np
import matplotlib

print("Python 版本:", sys.version)
print("NumPy 版本:", np.__version__)
print("matplotlib 版本:", matplotlib.__version__)

三、NumPy

NumPy(Numerical Python)是一个用于科学计算的Python库。它提供了一个强大的多维数组对象(ndarray),用于进行高效的数值运算和数据处理。Numpy的主要功能包括:

  1. 多维数组:Numpy的核心是ndarray对象,它是一个多维数组,可以存储同类型的元素。这使得Numpy非常适合处理向量、矩阵和其他多维数据结构。
  2. 数学函数:Numpy提供了许多常用的数学函数,如三角函数、指数函数、对数函数等。这些函数可以直接应用于整个数组,而无需编写循环。
  3. 广播(Broadcasting):Numpy支持不同形状的数组之间的运算,通过广播机制,可以对形状不同的数组进行逐元素的操作,而无需显式地编写循环。
  4. 线性代数运算:Numpy提供了丰富的线性代数运算函数,如矩阵乘法、求解线性方程组、特征值计算等。
  5. 随机数生成:Numpy包含了用于生成各种概率分布的随机数的函数,如均匀分布、正态分布、泊松分布等。
  6. 数据操作:Numpy提供了很多用于操作数组的函数,如切片、索引、排序、去重等。

Numpy广泛应用于科学计算、数据分析、机器学习等领域。它的高效性和便捷性使得它成为Python数据科学生态系统中不可或缺的组成部分。

0、多维数组对象(ndarray)

NumPy的ndarray对象是NumPy库中最重要的对象之一,也是进行科学计算的核心数据结构。ndarray代表了一个多维的数组,可以存储相同类型的元素。

多维数组的属性
  • ndarray.shape:返回表示数组形状的元组,例如(2, 3)表示2行3列的数组。
  • ndarray.dtype:返回数组中元素的数据类型,例如intfloatbool等。
  • ndarray.ndim:返回数组的维度数,例如1表示一维数组,2表示二维数组。

1、创建数组

【深度学习】 Python 和 NumPy 系列教程(九):NumPy详解:1、创建数组的n种方式_QomolangmaH的博客-CSDN博客https://blog.csdn.net/m0_63834988/article/details/132782221?spm=1001.2014.3001.5501

https://blog.csdn.net/m0_63834988/article/details/132782221?spm=1001.2014.3001.5501

2、数组操作

【深度学习】 Python 和 NumPy 系列教程(十):NumPy详解:2、数组操作(索引和切片、形状操作、转置操作、拼接操作)_QomolangmaH的博客-CSDN博客https://blog.csdn.net/m0_63834988/article/details/132830547?spm=1001.2014.3001.5501

https://blog.csdn.net/m0_63834988/article/details/132830547?spm=1001.2014.3001.5501

3、数组数学

【深度学习】 Python 和 NumPy 系列教程(十一):NumPy详解:3、数组数学(元素、数组、矩阵级别的各种运算)_QomolangmaH的博客-CSDN博客

https://blog.csdn.net/m0_63834988/article/details/132863360?spm=1001.2014.3001.5501

4、数组广播

NumPy广播(Broadcast)是指在不同形状的数组之间进行运算的一种机制。它允许我们在不显式复制数据的情况下,对具有不同形状的数组进行逐元素的操作。广播可以使我们更方便地进行数组运算,提高代码的简洁性和效率。

在进行广播运算时,NumPy遵循一套严格的规则:

  • 数组维度不同时,将维度较小的数组进行扩展,使其与维度较大的数组具有相同的维度数。
  • 如果两个数组在某个维度上的形状相等,或其中一个数组在该维度上的形状为1,则认为它们在该维度上是兼容的。
  • 如果两个数组在所有维度上都是兼容的,它们可以一起进行广播。
  • 在广播中,沿着形状中为1的维度进行复制,以使两个数组具有相同的形状。

广播的过程是自动进行的,无需显式编写循环或复制数据。让我们通过一个具体的示例来说明广播的工作原理:

代码语言:javascript复制
import numpy as np

# 创建两个数组
a = np.array([1, 2, 3])
b = np.array([[4, 5, 6], [7, 8, 9]])

# 进行广播运算
c = a   b
print(c)

在这个例子中,数组a的形状是(3,),数组b的形状是(2, 3)。根据广播的规则,a的形状会被扩展为(2, 3),然后两个数组逐元素相加,得到结果数组c。输出结果如下:

代码语言:javascript复制
[[ 5  7  9]
 [ 8 10 12]]

通过广播,我们可以在不改变数组形状的情况下,对不同形状的数组进行逐元素的操作。这使得我们可以更灵活地处理数据,并编写更简洁的代码。需要注意的是,虽然广播可以方便地进行数组运算,但在某些情况下可能会引起歧义或错误的结果。因此,在使用广播时,建议仔细理解广播规则,并确保操作的正确性。

5、排序操作

1. np.sort() 函数

该函数返回一个数组的排序副本

代码语言:javascript复制
import numpy as np

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

# 对数组进行排序
b = np.sort(a)
print(b)
# 输出: [1 2 3 4 5]
2. np.argsort() 函数

该函数返回数组排序后的索引。

代码语言:javascript复制
import numpy as np

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

# 返回排序后的索引
indices = np.argsort(a)
print(indices)
# 输出: [1 3 0 2 4]
3. ndarray.sort() 方法

该方法原地对数组进行排序,不返回副本。

代码语言:javascript复制
import numpy as np

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

# 原地对数组进行排序
a.sort()
print(a)
# 输出: [1 2 3 4 5]
4. 按列或行排序

可以指定 axis 参数来按列或行对二维数组进行排序。

代码语言:javascript复制
import numpy as np

a = np.array([[3, 1, 4], [2, 5, 0]])

# 按列排序
b = np.sort(a, axis=0)
print(b)
# 输出:
# [[2 1 0]
#  [3 5 4]]

# 按行排序
c = np.sort(a, axis=1)
print(c)
# 输出:
# [[1 3 4]
#  [0 2 5]]
5. np.lexsort() 函数

该函数根据键的字典顺序对多个序列进行间接排序。

代码语言:javascript复制
import numpy as np

a = np.array([[3, 1, 4], [2, 5, 0]])
names = np.array(['Tom', 'John'])

# 使用lexsort进行间接排序
indices = np.lexsort((names, a[:, 0]))
print(indices)
# 输出: [1 0]

sorted_data = a[indices]
print(sorted_data)
# 输出:
# [[2 5 0]
#  [3 1 4]]
6. np.partition() 函数

该函数可以在数组中进行分区操作,将数组分割为满足指定条件的两个部分。分区后,左侧的元素都小于或等于右侧的元素,但它们之间的顺序是未定义的。

代码语言:javascript复制
import numpy as np

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

# 对数组进行分区
b = np.partition(a, 2)
print(b)
# 输出: [1 2 3 4 5]
7. np.argpartition() 函数

该函数返回分区操作后的索引

代码语言:javascript复制
import numpy as np

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

# 返回分区后的索引
indices = np.argpartition(a, 2)
print(indices)
# 输出: [1 3 0 2 4]
8. ndarray.argsort() 方法

该方法返回数组排序后的索引,类似于 np.argsort() 函数。

代码语言:javascript复制
import numpy as np

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

# 返回排序后的索引
indices = a.argsort()
print(indices)
# 输出: [1 3 0 2 4]

9. np.searchsorted() 函数

该函数用于在已排序的数组中查找指定元素应该插入的位置,以9.保持排序顺序。

代码语言:javascript复制
import numpy as np

a = np.array([1, 3, 4, 4, 6])

# 查找元素应该插入的位置
index = np.searchsorted(a, 5)
print(index)
# 输出: 4

0 人点赞