【python 第三方库】numpy

2024-01-25 00:00:00

目录:

numpy 模块介绍

NumPy 提供了一个强大的多维数组对象 ndarray 以及一系列用于高效操作这些数组的函数,在数据科学、机器学习、工程计算等领域非常常用。

NumPy 的核心设计目标是高性能。其 ndarray 对象在内存中以连续块存储同类型数据,底层运算由优化的 C 和 Fortran 代码实现,避免了 Python 解释器循环的开销。这使得 NumPy 在处理大规模数值计算时,速度通常比纯 Python 列表快 10 到 100 倍甚至更多,同时内存占用也更小。例如,对百万级数组求和,NumPy 耗时约 0.0005秒,而纯 Python 列表求和约需0.05秒。

安装

$ pip3 install numpy

安装完成后,通过如下代码验证:

import numpy as np

print(np.__version__)  # 打印 NumPy 版本号

在 Python 社区,通常使用 import numpy as np 作为标准导入方式,np 已成为公认的别名,使代码更简洁。

多种数组创建方法

import numpy as np

# 1. 从 Python 列表或元组创建
arr_from_list = np.array([1, 2, 3, 4, 5])
print(f'arr_from_list: {arr_from_list}')
arr_from_nested_list = np.array([[1, 2, 3], [4, 5, 6]])
print(f'arr_from_nested_list: {arr_from_nested_list}')

# 2. 创建具有初始占位符的数组(高效预分配内存)
zeros_arr = np.zeros((3, 4))  # 创建 3 行 4 列的全 0 数组
print(f'zeros_arr: {zeros_arr}')
ones_arr = np.ones((2, 3), dtype=np.int32)  # 创建全 1 数组,并指定数据类型
print(f'ones_arr: {ones_arr}')
empty_arr = np.empty((2, 3))  # 创建未初始化的数组,内容为内存残留值
print(f'empty_arr: {empty_arr}')

# 3. 创建数字序列
seq_arr = np.arange(5)  # 类似 range,生成 [0, 1, 2, 3, 4]
print(f'seq_arr: {seq_arr}')
linspace_arr = np.linspace(0, 10, 5)  # 在 0 到 10 之间生成 5 个等间距数 [0., 2.5, 5., 7.5, 10.]
print(f'linspace_arr: {linspace_arr}')

# 4. 创建特殊矩阵
eye_matrix = np.eye(3)  # 创建 3x3 的单位矩阵
print(f'eye_matrix: {eye_matrix}')
full_matrix = np.full((3, 3), 6, dtype='complex')  # 创建 3x3 且所有元素为 6 的复数数组
print(f'full_matrix: {full_matrix}')

数组基本属性

import numpy as np

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

print("数组类型:", type(arr))        # <class 'numpy.ndarray'>
print("数组维度(ndim):", arr.ndim)   # 2
print("数组形状(shape):", arr.shape) # (2, 3) -> 2行3列
print("元素总数(size):", arr.size)   # 6
print("元素类型(dtype):", arr.dtype) # int64

索引和切片

import numpy as np

arr = np.arange(12).reshape(3, 4)  # 创建 3x4 数组 [[0,1,2,3], [4,5,6,7], [8,9,10,11]]

# 基础索引与切片
print(arr[1, :])       # 获取第2行(索引1): [4 5 6 7]
print(arr[:, 1::2])    # 获取所有行,从第 2 列开始每隔一列取一列

# 布尔索引:通过条件筛选元素
mask = arr > 5
print(arr[mask])       # 获取所有大于5的元素: [ 6  7  8  9 10 11]

# 花式索引:使用整数数组索引
print(arr[[0, 2], [1, 3]])  # 取(0,1)和(2,3)位置的元素: [ 1 11]

形状操作与数组变形

可以方便地改变数组的形状,但需保证变形前后元素总数不变。

import numpy as np

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

# 调整形状
reshaped = arr.reshape(4, 1)  # 变为4行1列 [[1], [2], [3], [4]]
print(f'reshaped: {reshaped}')

# 转置
transposed = arr.T  # 行变列,列变行 [[1, 3], [2, 4]]
print(f'transposed: {transposed}')

# 展平为一维数组
flattened_c = arr.flatten(order='C')  # 按行优先展平(默认): [1, 2, 3, 4]
flattened_f = arr.flatten(order='F')  # 按列优先展平: [1, 3, 2, 4]
print(f'flattened_c: {flattened_c}')
print(f'flattened_f: {flattened_f}')

# 数组拼接
new_arr = np.vstack([arr, [[5, 6]]])  # 垂直堆叠,变为 3x2 数组
print(f'new_arr: {new_arr}')

矢量化运算

NumPy 的核心魅力在于矢量化,即对整个数组执行运算而无需编写显式循环,这带来了巨大的性能提升。

import numpy as np

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

# 元素级运算
print(a + b)   # [5 7 9]
print(a * 2)   # [2 4 6]
print(a > 1)   # [False  True  True]

广播机制

广播是 NumPy 的一项强大规则,它允许不同形状的数组进行算术运算。系统会自动将较小的数组”广播”到较大数组的形状,以便它们具有兼容的维度。

import numpy as np

matrix = np.ones((3, 3))  # 3x3全1矩阵
row_vector = np.array([1, 2, 3])  # 1x3行向量
print(f'row_vector: {row_vector}')

# 行向量被广播到与矩阵相同的形状,然后执行加法
result = matrix + row_vector
print(f'result: {result}')
# 等价于 matrix + [[1,2,3], [1,2,3], [1,2,3]]
# 结果: [[2., 3., 4.], [2., 3., 4.], [2., 3., 4.]]

聚合函数

聚合函数,可以快速计算数组的统计特征,并支持按指定轴(维度)进行计算。

import numpy as np

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

print(np.sum(arr))          # 全局求和: 10
print(np.mean(arr, axis=0)) # 沿第0轴(列)求均值: [2. 3.]
print(np.std(arr))          # 全局标准差: 1.118033988749895
print(np.median(arr))       # 中位数: 2.5

数组元素增删改

虽然 ndarray 大小固定,但 NumPy 仍提供了函数来返回修改后的新数组。

import numpy as np

arr = np.array([1, 2, 3])

# 添加元素
arr_appended = np.append(arr, [4, 5])  # 在末尾添加: [1 2 3 4 5]
print(f'arr_appended: {arr_appended}')
arr_inserted = np.insert(arr, 1, 0)    # 在索引 1 处插入 0: [1 0 2 3]
print(f'arr_inserted: {arr_inserted}')

# 删除元素
arr_deleted = np.delete(arr, 1)        # 删除索引 1 的元素: [1 3]
print(f'arr_deleted: {arr_deleted}')

# 修改元素(通过索引直接赋值是原地操作)
arr[1] = 4  # 将索引 1 的元素改为 4: [1 4 3]
print(f'arr: {arr}')

# 条件修改
arr_cond = np.array([1, 2, 3, 4])
np.place(arr_cond, arr_cond > 2, arr_cond[arr_cond > 2] * 2) # 大于 2 的元素乘以 2: [1 2 6 8]
print(f'arr_cond: {arr_cond}')

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: