1.什么是Numpy
NumPy 是一个用于 Python 编程语言的开源库,它的主要功能是支持大型多维数组和矩阵,并提供了大量的数学函数来操作这些数组。NumPy 是 Python 科学计算生态系统的核心组成部分之一,广泛应用于数据分析、科学计算、机器学习等领域。
主要特点:
高性能数组操作:NumPy 提供了一种高效的多维数组对象,以及用于对其进行操作的函数。这些数组在内存中是连续的,因此可以高效地进行访问和操作。
广播功能:NumPy 支持数组间的广播操作,即使数组的形状不完全匹配也能执行数学运算。
矢量化操作:通过矢量化操作,NumPy 可以对整个数组进行操作而无需显式地使用循环,从而极大地提高了代码的执行效率。
内置数学函数:NumPy 包含了大量的数学函数,如四则运算、三角函数、指数和对数函数等。
线性代数运算:包括矩阵乘法、求逆、特征值分解等线性代数运算。
随机数生成:提供了生成各种分布的随机数的功能。
集成性:NumPy 可以很好地与其他 Python 库集成,如 SciPy、Pandas 和 Matplotlib 等。
The fundamental package for scientific computing with Python --Numpy官方描述
https://numpy.org/ --官网
2.安装
pip install numpy
3.Numpy创建数组
在Python中使用NumPy
库可以非常方便地创建不同维度的数组。下面我将展示如何创建一维、二维和三维的NumPy
数组。
3.1.创建一维数组
一维数组可以看作是一个简单的列表。
import numpy as np
# 使用列表创建一维数组
arr_1d = np.array([1, 2, 3, 4, 5])
print("一维数组:", arr_1d)
3.2.创建二维数组
二维数组通常用于表示矩阵。
# 使用嵌套列表创建二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("二维数组:\n", arr_2d)
3.3.创建三维数组
三维数组可以看作是多个二维矩阵堆叠在一起。
# 使用嵌套列表创建三维数组
arr_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print("三维数组:\n", arr_3d)
4.Numpy创建填充矩阵
4.1.全零矩阵
在 NumPy 中创建一个全零矩阵非常简单,你可以使用 numpy.zeros()
函数。这个函数允许你指定矩阵的形状,并返回一个由零组成的数组。
下面是一些示例代码,展示如何创建不同维度的全零矩阵:
import numpy as np
# 创建一个一维全零数组
zero_1d = np.zeros(5)
print("一维全零数组:", zero_1d)
# 创建一个二维全零矩阵
zero_2d = np.zeros((3, 4))
print("二维全零矩阵:\n", zero_2d)
# 创建一个三维全零矩阵
zero_3d = np.zeros((2, 3, 2))
print("三维全零矩阵:\n", zero_3d)
这里,np.zeros()
函数的第一个参数是一个表示数组形状的元组。对于一维数组,只需要提供一个整数;对于二维或更高维的数组,则需要提供一个包含各个维度长度的元组。
4.2.创建单值填充矩阵
在 NumPy 中创建一个填充有相同值的矩阵可以使用 numpy.full()
函数。这个函数接受一个形状参数和一个填充值参数,返回一个具有指定形状且所有元素都为给定值的数组。
下面是创建不同维度的单值矩阵的示例代码:
import numpy as np
# 创建一个一维单值数组
single_value_1d = np.full(5, 7)
print("一维单值数组:", single_value_1d)
# 创建一个二维单值矩阵
single_value_2d = np.full((3, 4), 7)
print("二维单值矩阵:\n", single_value_2d)
# 创建一个三维单值矩阵
single_value_3d = np.full((2, 3, 2), 7)
print("三维单值矩阵:\n", single_value_3d)
5.Numpy对比List
NumPy
数组与 Python 原生 list
在性能上有显著的不同,特别是在科学计算和大规模数据处理方面。以下是两者之间的一些关键区别和性能比较:
5.1.内存占用
- NumPy 数组 通常比等效的 Python 列表占用更少的内存。这是因为 NumPy 数组中的元素都是同一种数据类型,而 Python 列表中的元素可以是任何类型,这会引入额外的开销。
- NumPy 数组的内存布局更加紧凑,减少了数据访问的时间。
5.2.计算速度
- NumPy 数组 在执行数学运算时通常比 Python 列表快得多。这是因为它利用了底层的 C 语言实现来进行高效的向量化操作,避免了 Python 的解释器开销。
- NumPy 提供了诸如广播(broadcasting)这样的特性,可以在不需要显式循环的情况下执行复杂的数学运算,这大大提高了效率。
5.3.索引和切片
- 对于索引和切片操作,NumPy 数组通常比 Python 列表更快。NumPy 的索引机制被优化过,可以快速访问数据。
5.4.元素增删
- Python 列表 在增删元素方面通常比 NumPy 数组表现更好。这是因为列表是动态调整大小的数据结构,而 NumPy 数组的大小一旦创建后通常是固定的。如果需要改变大小,整个数组可能需要重新分配内存,这可能会导致性能下降。
5.5.示例代码
下面是一个简单的示例来比较 NumPy 数组和 Python 列表在执行加法运算时的速度差异:
import numpy as np
import time
size_of_vec = 1000000
def pure_python_version():
t1 = time.time()
X = range(size_of_vec)
Y = range(size_of_vec)
Z = [X[i] + Y[i] for i in range(len(X))]
return time.time() - t1
def numpy_version():
t1 = time.time()
X = np.arange(size_of_vec)
Y = np.arange(size_of_vec)
Z = X + Y
return time.time() - t1
t1 = pure_python_version()
t2 = numpy_version()
print(t1, t2)
print("NumPy is in this example {} times faster!".format(t1/t2))
总结来说,如果你需要高效地处理数值型数据并执行数学运算,那么使用 NumPy 数组会是一个很好的选择。而对于那些需要频繁修改大小或进行复杂数据结构操作的任务,则 Python 列表可能更适合。
6.Numpy切片
在 NumPy 中,切片是一种非常强大的功能,允许你从数组中选择特定的元素或子集。切片语法类似于 Python 的列表切片语法,但因为 NumPy 数组可以有多维,所以切片也可以应用于多维数组。
6.1.一维数组的切片
对于一维数组,你可以使用类似于 Python 列表的切片语法:
import numpy as np
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# 选择第3到第6个元素(索引2到5)
slice1 = arr[2:6]
print("Slice from index 2 to 5:", slice1)
# 选择所有元素,步长为2
slice2 = arr[::2]
print("Every second element:", slice2)
# 选择所有元素,从最后一个开始,步长为-1
slice3 = arr[::-1]
print("Reverse the array:", slice3)
6.2.多维数组的切片
对于多维数组,你可以在每个维度上指定切片:
# 创建一个二维数组
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 选择第一行
row1 = arr2d[0, :]
print("First row:", row1)
# 选择第一列
col1 = arr2d[:, 0]
print("First column:", col1)
# 选择第1和第3行的第2列
rows1and3_col2 = arr2d[[0, 2], 1]
print("Element at (0, 1) and (2, 1):", rows1and3_col2)
# 选择中间两行的中间两列
middle_rows_cols = arr2d[1:3, 1:3]
print("Middle 2x2 subarray:\n", middle_rows_cols)
6.3.进阶切片
除了标准的切片操作外,NumPy 还支持更复杂的切片方式,比如布尔索引和整数索引。
布尔索引
使用布尔数组来索引另一个数组。
# 选择所有大于5的元素
mask = arr > 5
selected_elements = arr[mask]
print("Elements greater than 5:", selected_elements)
整数索引
使用整数数组来索引另一个数组。
# 选择特定位置的元素
indices = np.array([1, 3, 5])
selected_elements = arr[indices]
print("Selected elements by indices:", selected_elements)
6.4.注意事项
- 如果没有指定起始或结束索引,则默认从开头或到结尾。
- 步长可以是负数,这将反向遍历数组。
这些就是 NumPy 中切片的基本用法。切片操作对于数据处理和分析非常重要,能够让你以简洁的方式提取所需的数据部分。
7.结语
Numpy是一个强大的数组、矩阵处理工具,可以作为机器学习算法的前置数据生成或处理工具。