Python科学计算库Numpy:pip安装与基础使用
1. 引言:什么是NumPy?
NumPy(Numerical Python)是Python中用于科学计算的核心库。它提供了一个高性能的多维数组对象(ndarray),以及用于处理这些数组的工具。NumPy是许多其他科学计算库(如SciPy、Pandas、Matplotlib)的基础,它的出现极大地推动了Python在数据分析、机器学习和科学研究领域的应用。
NumPy的主要优势在于其处理大型数据集的效率。与Python原生的列表相比,NumPy数组在存储效率、运算速度和功能丰富性上都有显著提升,这得益于其底层用C和Fortran语言实现。
2. 安装NumPy
安装NumPy非常简单,通常使用Python的包管理器pip进行。
2.1 检查Python和pip
在安装NumPy之前,请确保您的系统已经安装了Python和pip。您可以在命令行(Windows的cmd或PowerShell,macOS/Linux的终端)中输入以下命令来检查:
bash
python --version
pip --version
如果两者都已正确安装,您将看到它们的版本信息。如果pip未安装或版本过旧,您可能需要先升级pip:
bash
python -m pip install --upgrade pip
2.2 使用pip安装NumPy
一旦确认pip可用,您就可以使用以下命令来安装NumPy:
bash
pip install numpy
这个命令会从Python Package Index (PyPI) 下载最新版本的NumPy并安装到您的Python环境中。
2.3 验证安装
安装完成后,您可以在Python交互式环境中验证NumPy是否安装成功:
“`python
import numpy as np
print(np.version)
“`
如果没有报错并打印出NumPy的版本号,那么恭喜您,NumPy已经成功安装并可以开始使用了!
3. NumPy基础使用
NumPy的核心是其ndarray对象,一个N维数组,用于存储相同数据类型的元素。
3.1 创建NumPy数组
有多种方法可以创建NumPy数组。
3.1.1 从Python列表或元组创建
这是最常见的创建方式。
“`python
import numpy as np
从列表创建一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print(“一维数组:”, arr1)
print(“数据类型:”, arr1.dtype)
print(“形状:”, arr1.shape) # (5,) 表示一个包含5个元素的一维数组
从嵌套列表创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(“\n二维数组:\n”, arr2)
print(“形状:”, arr2.shape) # (2, 3) 表示2行3列的二维数组
print(“维度:”, arr2.ndim) # 2
“`
3.1.2 使用内置函数创建特定数组
NumPy提供了许多函数来快速创建特定类型的数组,例如全零、全一、空数组或指定范围的数组。
“`python
创建一个3×4的全零数组
zeros_arr = np.zeros((3, 4))
print(“\n全零数组:\n”, zeros_arr)
创建一个2x3x2的全一数组
ones_arr = np.ones((2, 3, 2))
print(“\n全一数组:\n”, ones_arr)
创建一个3×3的空数组(实际内容是随机的,取决于内存状态)
empty_arr = np.empty((3, 3))
print(“\n空数组(内容随机):\n”, empty_arr)
创建一个单位矩阵 (对角线为1,其余为0)
eye_arr = np.eye(3)
print(“\n单位矩阵:\n”, eye_arr)
创建一个指定范围的数组 (类似Python的range)
arange_arr = np.arange(0, 10, 2) # 从0到10(不包括10),步长为2
print(“\narange数组:”, arange_arr)
创建一个指定数量的等间隔数组
linspace_arr = np.linspace(0, 10, 5) # 在0到10之间生成5个等间隔的数
print(“\nlinspace数组:”, linspace_arr)
“`
3.2 数组的属性
每个NumPy数组都有一些有用的属性:
dtype: 数组元素的数据类型。shape: 数组的维度(元组形式)。ndim: 数组的维度数量。size: 数组中元素的总数。itemsize: 数组中每个元素的字节大小。
“`python
import numpy as np
arr = np.array([[1.1, 2.2, 3.3], [4.4, 5.5, 6.6]], dtype=np.float64)
print(“数据类型:”, arr.dtype)
print(“形状:”, arr.shape)
print(“维度:”, arr.ndim)
print(“元素总数:”, arr.size)
print(“每个元素的字节大小:”, arr.itemsize)
“`
3.3 数组索引和切片
NumPy数组的索引和切片与Python列表类似,但更加强大,支持多维数组的灵活操作。
“`python
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
获取单个元素
print(“arr[0, 0]:”, arr[0, 0]) # 第一行第一列的元素 (1)
print(“arr[1, 2]:”, arr[1, 2]) # 第二行第三列的元素 (6)
行切片
print(“\n第一行:”, arr[0, :]) # 或 arr[0]
print(“前两行:\n”, arr[:2, :]) # 或 arr[:2]
列切片
print(“\n第二列:”, arr[:, 1])
区域切片
print(“\n子矩阵(左上角2×2):\n”, arr[:2, :2])
布尔索引
选出大于5的元素
boolean_mask = arr > 5
print(“\n布尔掩码:\n”, boolean_mask)
print(“大于5的元素:”, arr[boolean_mask]) # 或 arr[arr > 5]
花式索引(Fancy Indexing)
选取特定行和列
print(“\n特定元素 (arr[0,2], arr[2,1]):”, arr[[0, 2], [2, 1]]) # (3, 8)
选取特定行
print(“特定行 (行0, 行2):\n”, arr[[0, 2]])
“`
3.4 数组运算
NumPy数组的一大优势是其矢量化运算能力,即对整个数组进行操作,而无需显式编写循环。
3.4.1 元素级运算
对数组执行数学运算(加、减、乘、除等)时,这些操作会按元素逐个应用。
“`python
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
加法
print(“arr1 + arr2:”, arr1 + arr2) # [5 7 9]
乘法 (元素级乘法)
print(“arr1 * arr2:”, arr1 * arr2) # [4 10 18]
标量乘法
print(“arr1 * 2:”, arr1 * 2) # [2 4 6]
各种数学函数
print(“sin(arr1):”, np.sin(arr1))
print(“sqrt(arr2):”, np.sqrt(arr2))
“`
3.4.2 矩阵乘法
对于矩阵乘法,需要使用@运算符或np.dot()函数。
“`python
import numpy as np
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])
矩阵乘法
matrix_product = matrix1 @ matrix2
print(“\n矩阵乘法:\n”, matrix_product)
结果:
[[15 + 27, 16 + 28],
[35 + 47, 36 + 48]]
[[19, 22],
[43, 50]]
使用np.dot()
dot_product = np.dot(matrix1, matrix2)
print(“\nnp.dot() 矩阵乘法:\n”, dot_product)
“`
3.4.3 聚合函数
NumPy提供了许多用于计算数组统计值的函数,如sum()、mean()、max()、min()等。这些函数可以作用于整个数组,也可以沿着特定轴(行或列)进行。
“`python
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6]])
整个数组的和
print(“所有元素的和:”, arr.sum())
整个数组的平均值
print(“所有元素的平均值:”, arr.mean())
沿列求和 (axis=0)
print(“沿列求和:”, arr.sum(axis=0)) # [5 7 9] (1+4, 2+5, 3+6)
沿行求和 (axis=1)
print(“沿行求和:”, arr.sum(axis=1)) # [6 15] (1+2+3, 4+5+6)
沿列找最大值
print(“沿列最大值:”, arr.max(axis=0))
“`
3.5 广播 (Broadcasting)
广播是NumPy中一项非常强大的功能,它允许不同形状的数组在特定规则下进行元素级运算,而无需显式地复制数据以使它们的形状匹配。
广播的规则:
1. 如果两个数组的维度数不相同,那么维度较小的数组的形状会在其前面填充1,直到维度数相同。
2. 在任何维度上,如果两个数组的长度相同,或者其中一个数组的长度为1,那么它们在该维度上是兼容的。
3. 如果两个数组在任何维度上都不兼容,将引发错误。
“`python
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6]]) # 形状 (2, 3)
b = np.array([10, 20, 30]) # 形状 (3,)
b会被广播成 [[10, 20, 30],
[10, 20, 30]]
result = a + b
print(“广播示例 a + b:\n”, result)
结果:
[[11 22 33]
[14 25 36]]
c = np.array([[100],
[200]]) # 形状 (2, 1)
c会被广播成 [[100, 100, 100],
[200, 200, 200]]
result2 = a + c
print(“\n广播示例 a + c:\n”, result2)
结果:
[[101 102 103]
[204 205 206]]
“`
4. 总结
NumPy是Python进行科学计算的基石。通过其高效的ndarray对象和丰富的函数集,它为数据操作、数学运算和统计分析提供了强大的支持。掌握NumPy的安装和基本使用是进入Python数据科学领域的第一步,也是至关重要的一步。从简单的数组创建到复杂的索引、切片和广播,NumPy提供了一套直观而强大的工具集,能够显著提高您的数据处理效率。