Python 科学计算核心库 NumPy 详解
为什么 NumPy 是 Python 科学计算的核心?
如果你正在进行数据科学或机器学习项目,那么你一定会接触到 Python,而如果你在 Python 中进行科学计算,NumPy 就是你必不可少的工具。它被誉为 Python 数值计算的'发动机',是整个数据分析和科学计算生态系统的基石。NumPy 凭借其高效的 ndarray 数组对象,让你能在 Python 中处理大规模数据时,拥有接近 C 语言的运算速度。
为什么 NumPy 如此重要?
在传统的 Python 列表操作中,数据存取的速度相对较慢,尤其是在需要进行大量数值计算时。NumPy 通过其多维数组(ndarray)结构,将这些计算的效率提升了一个数量级,同时极大地优化了内存使用。你将能够轻松实现高效的矩阵运算、线性代数、统计运算等,甚至无需手动编写复杂的循环代码。
举个简单的例子,假设你有一个包含成千上万的数据点的二维矩阵,使用 Python 自带的列表来存储和操作这些数据,不仅处理速度慢,而且内存占用也高。使用 NumPy 后,你可以轻松创建一个高效的 ndarray 数组,并进行一系列优化计算。
Numpy 数组的核心特性
多维性
同质性
- 数组里面必须要一样,如果有字符串和数字,会将数字转换为字符串
- 数组里面如果有不同精度的数据,都会转换为高精度
arr = np.array([1, 2, 'hello'])
Numpy 数组的属性
| 属性名称 | 解释 | 使用示例 |
|---|
| shape | 数组的形状:行数和列数(或更高维度的尺寸) | arr.shape |
| ndim | 维度数量:数组是维度(1 维,2 维,3 维) | arr.ndim |
| size | 总元素个数:数组中所有元素的总数 | arr.size |
| dtype | 元素类型:数组中元素的类型 | arr.dtype |
| T | 转置:和高数中概念一样 | arr.T |
arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr) print('arr 的形状', arr.shape)
ndarray 的创建
| 用途 | 方法 | | | |
|---|
| 基础创建 | np.array() | np.copy() | | |
| 预定义形状填充 | np.zeros() | np.ones() | np.empty() | np.full() |
| 基于数值范围生成 | np.arange() | np.linspace() | np.logspace() | |
| 特殊矩阵生成 | np.eye() | np.diag() | | |
| 随机数组生成 | np.random.rand() | np.random.randn() | np.random.randint() | |
| 高级构造方法 | np.fromfunction() | np.loadtxt() | | |
基础创建
list1 = [[1, 2, 3], [4, 5, 6]] arr = np.array(list1, dtype=float)
预定义形状填充
基于数值范围生成
特殊矩阵
随机数组
ndarray 的数据类型
布尔类型:bool 整数:int uint 浮点数:float 复数:complex
索引与切片
索引 / 切片相关提取内容
| 索引 / 切片类型 | 描述 / 用法 | 代码实例 | 运行结果 |
|---|
| 基本索引 | 通过整数索引直接访问元素,索引从 0 开始 | arr[1, 2] | 6(第 2 行、第 3 列的元素) |
| 行 / 列切片 | 用冒号 : 选择行或列的子集 | arr[0:2, :](取前 2 行,所有列) | [[1,2,3], [4,5,6]] |
| 连续切片 | 从起始索引到结束索引,按步长切片(左闭右开) | arr[:, 0:3:2](取所有行,列按步长 2 切片) | [[1,3], [4,6], [7,9]] |
| 使用 slice 函数 | 通过 slice(start, stop, step) 定义切片规则 | col_slice = slice(0, 3, 2)<br>arr[:, col_slice] | 同 '连续切片' 结果 |
| 布尔索引 | 通过布尔条件筛选元素,支持 && 、 | | |
ndarray 的运算
numpy 中的常用函数
基础
统计
求和,平均值,中位数,标准差,方差
arr = np.random.randint(1, 20, 8) << [12 16 8 16 10 16 1 7] print(arr)
最大值,最小值
分位数,累积和,累积积
比较
比较是否大于,小于,等于
arr = [3, 4, 5, 2, 1] print(np.greater(arr, 4))
逻辑与,或,非
print(np.logical_and([0, 0, 1], [1, 0, 1])) print(np.logical_or([0, 0, 1], [1, 0, 1])) print(np.logical_not([0, 1])) << [False False True] [ True False True] [ True False]
检查数组中是否有一个是 True,是否全是 True,自定义条件
其它