Python NumPy库的基础使用教程
NumPy 简介
NumPy(Numerical Python)是 Python 中最重要的数学计算库之一,它为 Python 提供了高性能的多维数组对象,以及用于处理这些数组的工具。NumPy 的设计初衷是为了高效地处理数值数据,其底层实现使用了 C 语言,这使得 NumPy 在处理大规模数据时,速度远远超过 Python 原生的列表(list)。
NumPy 的安装
在开始使用 NumPy 之前,需要先安装它。如果你使用的是 Anaconda 发行版,NumPy 已经默认安装好了。如果没有安装,可以使用 pip 进行安装:
pip install numpy
NumPy 数组(ndarray)
创建 NumPy 数组
NumPy 中的核心数据结构是 ndarray
(N - dimensional array),即多维数组。可以通过多种方式创建 ndarray
。
- 从 Python 列表创建:
import numpy as np # 一维数组 arr1d = np.array([1, 2, 3]) print(arr1d) # 二维数组 arr2d = np.array([[1, 2, 3], [4, 5, 6]]) print(arr2d)
- 使用特定函数创建:
np.zeros()
:创建一个全零的数组。
zeros_arr = np.zeros((3, 4)) print(zeros_arr)
np.ones()
:创建一个全一的数组。
ones_arr = np.ones((2, 3)) print(ones_arr)
np.empty()
:创建一个内容未初始化的数组。这个函数执行速度非常快,因为它不会对数组元素进行初始化,其内容是数组在内存中的原始值。
empty_arr = np.empty((2, 2)) print(empty_arr)
np.arange()
:类似于 Python 的range()
函数,但返回的是一个 NumPy 数组。
arange_arr = np.arange(1, 10, 2) print(arange_arr)
np.linspace()
:在指定的区间内生成等间距的数组。
linspace_arr = np.linspace(0, 1, 5) print(linspace_arr)
NumPy 数组的属性
ndim
:获取数组的维度数量。arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr.ndim)
shape
:获取数组每个维度的大小,返回一个元组。print(arr.shape)
size
:获取数组中元素的总数。print(arr.size)
dtype
:获取数组中元素的数据类型。
可以在创建数组时指定数据类型,例如:print(arr.dtype)
arr = np.array([1, 2, 3], dtype=np.float64) print(arr.dtype)
NumPy 数组的索引和切片
一维数组的索引和切片
一维数组的索引和切片与 Python 列表类似。
arr = np.arange(10)
# 索引
print(arr[3])
# 切片
print(arr[2:5])
print(arr[::2])
二维数组的索引和切片
对于二维数组,需要指定两个索引,一个用于行,一个用于列。
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 索引
print(arr[1, 2])
# 切片
print(arr[1:, 1:])
可以通过省略号(...
)来简化索引。例如,如果有一个三维数组 arr3d
,arr3d[1, ...]
等价于 arr3d[1, :, :]
。
NumPy 数组的运算
算术运算
NumPy 数组支持各种算术运算,这些运算都是元素级别的。
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 加法
print(arr1 + arr2)
# 减法
print(arr1 - arr2)
# 乘法
print(arr1 * arr2)
# 除法
print(arr1 / arr2)
同样的运算也适用于二维及更高维度的数组,只要数组的形状相同。
矩阵运算
NumPy 提供了矩阵乘法的功能,使用 dot()
方法或 @
运算符。
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
# 矩阵乘法
print(np.dot(arr1, arr2))
print(arr1 @ arr2)
通用函数(ufunc)
NumPy 中的通用函数(ufunc)是一种对数组中每个元素进行操作的函数。常见的 ufunc 包括三角函数、指数函数、对数函数等。
- 三角函数:
arr = np.array([0, np.pi/2, np.pi]) print(np.sin(arr))
- 指数函数:
arr = np.array([1, 2, 3]) print(np.exp(arr))
- 对数函数:
arr = np.array([1, 10, 100]) print(np.log(arr))
NumPy 数组的形状操作
改变数组的形状
reshape()
:可以在不改变数组数据的情况下,改变数组的形状。
如果指定的形状与数组元素总数不匹配,会抛出arr = np.arange(12) new_arr = arr.reshape((3, 4)) print(new_arr)
ValueError
。flatten()
:将多维数组展平为一维数组。arr = np.array([[1, 2, 3], [4, 5, 6]]) flat_arr = arr.flatten() print(flat_arr)
数组的拼接
np.concatenate()
:可以沿着指定的轴拼接多个数组。arr1 = np.array([[1, 2], [3, 4]]) arr2 = np.array([[5, 6], [7, 8]]) # 按行拼接 row_concat = np.concatenate((arr1, arr2), axis = 0) print(row_concat) # 按列拼接 col_concat = np.concatenate((arr1, arr2), axis = 1) print(col_concat)
np.vstack()
和np.hstack()
:分别用于垂直(按行)和水平(按列)拼接数组。arr1 = np.array([1, 2]) arr2 = np.array([3, 4]) v_stack = np.vstack((arr1, arr2)) h_stack = np.hstack((arr1, arr2)) print(v_stack) print(h_stack)
数组的分割
np.split()
:可以沿着指定的轴将数组分割成多个子数组。
对于二维数组,可以指定按行或按列分割。arr = np.arange(9) sub_arrays = np.split(arr, 3) for sub_arr in sub_arrays: print(sub_arr)
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) row_sub_arrays = np.split(arr, 3, axis = 0) col_sub_arrays = np.split(arr, 3, axis = 1) for sub_arr in row_sub_arrays: print(sub_arr) for sub_arr in col_sub_arrays: print(sub_arr)
NumPy 数组的广播(Broadcasting)
广播是 NumPy 中一种强大的机制,它允许在形状不同的数组之间进行算术运算。当两个数组的形状不完全相同时,NumPy 会自动尝试按照一定的规则扩展数组的形状,使得运算能够进行。
- 规则:
- 从数组的最后一个维度开始比较。
- 如果两个数组在某一维度上的大小相同,或者其中一个数组在该维度上的大小为 1,则认为它们在该维度上是兼容的。
- 如果两个数组在所有维度上都兼容,则可以进行广播。
- 示例:
在这个例子中,arr1 = np.array([[1, 2, 3], [4, 5, 6]]) arr2 = np.array([10, 20, 30]) result = arr1 + arr2 print(result)
arr2
被广播为与arr1
形状相同的数组,然后进行元素级别的加法运算。
NumPy 中的数学统计函数
求和、求均值、求标准差等
np.sum()
:计算数组中所有元素的和,也可以指定轴进行求和。arr = np.array([[1, 2, 3], [4, 5, 6]]) total_sum = np.sum(arr) row_sum = np.sum(arr, axis = 1) col_sum = np.sum(arr, axis = 0) print(total_sum) print(row_sum) print(col_sum)
np.mean()
:计算数组的均值。arr = np.array([1, 2, 3, 4, 5]) mean_value = np.mean(arr) print(mean_value)
np.std()
:计算数组的标准差。arr = np.array([1, 2, 3, 4, 5]) std_value = np.std(arr) print(std_value)
最值相关函数
np.max()
和np.min()
:分别计算数组中的最大值和最小值,也可以指定轴。arr = np.array([[1, 2, 3], [4, 5, 6]]) max_value = np.max(arr) row_max = np.max(arr, axis = 1) col_max = np.max(arr, axis = 0) print(max_value) print(row_max) print(col_max)
np.argmax()
和np.argmin()
:返回数组中最大值和最小值的索引,同样可以指定轴。arr = np.array([10, 20, 15]) max_index = np.argmax(arr) min_index = np.argmin(arr) print(max_index) print(min_index)
NumPy 与文件操作
保存和加载 NumPy 数组
np.save()
:将 NumPy 数组保存为.npy
文件。arr = np.array([1, 2, 3, 4, 5]) np.save('my_array.npy', arr)
np.load()
:从.npy
文件中加载 NumPy 数组。loaded_arr = np.load('my_array.npy') print(loaded_arr)
np.savetxt()
和np.loadtxt()
:用于保存和加载文本文件。np.savetxt()
可以将数组保存为文本格式,np.loadtxt()
可以从文本文件中加载数据并转换为 NumPy 数组。arr = np.array([[1, 2, 3], [4, 5, 6]]) np.savetxt('my_text_array.txt', arr, delimiter = ',') loaded_text_arr = np.loadtxt('my_text_array.txt', delimiter = ',') print(loaded_text_arr)
通过以上对 NumPy 库的基础使用教程,你应该对 NumPy 的核心功能有了较为深入的理解。在实际的数据分析、科学计算以及机器学习等领域,NumPy 都是不可或缺的工具,熟练掌握它将大大提高你的编程效率和数据处理能力。