numpy基础
NumPy(Numerical Python)是 Python 科学计算领域的核心基础库,核心提供了高性能的多维数组对象ndarray,以及一套专为数组设计的高效操作函数。相较于 Python 原生列表,NumPy 数组在数值计算、批量数据处理中能实现数量级的效率提升,是数据分析、机器学习、数值模拟等领域的必备工具。numpy的数据类型为ndarraynp.array()是基础转换方式,用于标准化
目录
numpy 介绍
NumPy(Numerical Python)是 Python 科学计算领域的核心基础库,核心提供了高性能的多维数组对象ndarray,以及一套专为数组设计的高效操作函数。相较于 Python 原生列表,NumPy 数组在数值计算、批量数据处理中能实现数量级的效率提升,是数据分析、机器学习、数值模拟等领域的必备工具。numpy的数据类型为ndarray
安装与基础用法
通过 pip 安装:pip install numpy
创建数组示例:
# 创建2行3列的二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
# ndim:返回整数,表示数组的维度(也叫秩)
print("数组维度:", arr.ndim) # 输出:2
# shape:返回元组,表示数组的形状(行×列),多维数组为(维1,维2,维3...)
print("数组形状:", arr.shape) # 输出:(2, 3)
# size:返回整数,表示数组中元素的总个数
print("元素总个数:", arr.size) # 输出:6
# dtype:返回数组元素的数据类型,NumPy支持多种数值类型
print("元素数据类型:", arr.dtype) # 输出:int64(Windows多为int32,不影响使用)
shape是最常用的属性,直接赋值可修改数组形状,如arr.shape = (3,2)可将 2 行 3 列数组转为 3 行 2 列,要求总元素个数不变;创建数组时可通过
dtype手动指定类型,避免默认类型带来的问题,如np.array([1,2], dtype=np.float32);可通过
arr.dtype = np.float64修改已有数组的元素类型
特殊数组创建方法
zeros
创建指定形状的全零数组,默认数据类型为float64。
语法:np.zeros(shape, dtype=float)
示例:
import numpy as np
arr = np.zeros((2, 3)) # 生成 2 行 3 列的零矩阵
ones
创建指定形状的全 1 数组,默认数据类型为float64。
语法:np.ones(shape, dtype=float)
示例:
arr = np.ones((3, 2), dtype=int) # 生成 3 行 2 列的全 1 整型矩阵
empty
创建未初始化的数组,内容取决于内存状态,速度比zeros快。
语法:np.empty(shape, dtype=float)
示例:
arr = np.empty((2, 2)) # 生成未初始化的 2x2 数组
eye
创建单位矩阵(对角线为 1,其余为 0)。
语法:np.eye(N, M=None, k=0, dtype=float)
k控制对角线偏移(正数向上偏移,负数向下偏移)。
示例:
arr = np.eye(3) # 3x3 单位矩阵
arr_k = np.eye(3, k=1) # 对角线向上偏移 1
数值序列生成方法
arange
生成等差序列,类似 Python 的range,但支持浮点数。
语法:np.arange(start, stop, step, dtype=None)
- 区间为左闭右开
[start, stop)。
示例:
arr = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
arr_float = np.arange(0, 1, 0.3) # [0.0, 0.3, 0.6, 0.9]
linspace
生成指定数量的等间隔数值,区间为闭区间[start, stop]。
语法:np.linspace(start, stop, num=50, endpoint=True)
endpoint控制是否包含终点。
示例:
arr = np.linspace(0, 1, 5) # [0.0, 0.25, 0.5, 0.75, 1.0]
arr_no_end = np.linspace(0, 1, 5, endpoint=False) # [0.0, 0.2, 0.4, 0.6, 0.8]
关键区别与适用场景
- zeros/ones/eye 用于固定值初始化,
empty适合快速分配内存但无需初始值的场景。- arange 适合已知步长的序列,linspace 适合精确控制样本数量的场景(如绘图坐标生成)。
numpy索引的基本方法
NumPy提供了多种索引方式,用于访问和修改数组中的元素。常用的索引方法包括基本索引、切片索引、布尔索引和花式索引。
1基本索引
基本索引通过整数位置访问元素。对于一维数组,使用单个整数;对于多维数组,使用逗号分隔的整数元组
import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr[2]) # 输出3
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr_2d[1, 2]) # 输出6
2切片索引
切片索引允许选择数组的子集。语法与Python列表切片类似,但支持多维切片。
arr = np.array([0, 1, 2, 3, 4, 5])
print(arr[1:4]) # 输出[1 2 3]
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr_2d[:2, 1:]) # 输出[[2 3][5 6]]
3布尔索引
布尔索引使用布尔数组选择元素。常用于条件筛选。
arr = np.array([1, 2, 3, 4])
mask = arr > 2
print(arr[mask]) # 输出[3 4]
names = np.array(['Alice', 'Bob', 'Charlie'])
scores = np.array([85, 90, 75])
print(scores[names == 'Bob']) # 输出[90]
4花式索引
花式索引使用整数数组进行索引,可以非连续地选择元素
arr = np.array([10, 20, 30, 40, 50])
indices = [1, 3, 4]
print(arr[indices]) # 输出[20 40 50]
arr_2d = np.array([[1, 2], [3, 4], [5, 6]])
row_indices = [0, 2]
col_indices = [1, 0]
print(arr_2d[row_indices, col_indices]) # 输出[2 5]
NumPy 数组合并方法
vstack 垂直合并
vstack用于垂直方向(按行)合并数组,要求所有数组的列数相同。适用于将多个一维或二维数组堆叠成更高维度的数组。
示例代码:
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
result = np.vstack((a, b))
#结果[[1 2 3]
[4 5 6]]
hstack 水平合并
hstack用于水平方向(按列)合并数组,要求所有数组的行数相同。适用于连接相同行数的数组。
示例代码:
a = np.array([[1], [2]])
b = np.array([[3], [4]])
result = np.hstack((a, b))
#结果[[1 3]
[2 4]]
concatenate 通用合并
concatenate是最通用的合并函数,通过axis参数指定合并方向(axis=0 垂直合并,axis=1 水平合并)。支持更高维度的数组合并。
示例代码:
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
result = np.concatenate((a, b), axis=0)
#结果[[1 2]
[3 4]
[5 6]]
注意事项
- 合并前需确保数组在合并维度上的形状匹配
- 对于一维数组,
vstack会将其转为二维数组后合并stack函数会新增一个维度进行合并(不同于连接操作)- 大数组合并时建议预分配内存以提高性能
数组分割方法
NumPy提供了多种数组分割函数,用于将数组拆分为多个子数组。以下是常用的分割方法:
vsplit函数
垂直分割数组,沿垂直方向(行方向)分割。适用于二维及以上数组。
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
result = np.vsplit(arr, 3) # 分割为3个子数组
hsplit函数
水平分割数组,沿水平方向(列方向)分割。适用于二维及以上数组。
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
result = np.hsplit(arr, 3) # 分割为3个子数组
split函数
通用分割函数,可指定分割轴(axis参数)。默认沿第一个轴(axis=0)分割。
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
result = np.split(arr, 3, axis=1) # 沿列方向分割
dsplit函数
深度方向分割,适用于三维数组。
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
result = np.dsplit(arr, 2) # 沿深度方向分割
array_split函数
允许不均等分割,当不能均分时不会报错。
arr = np.array([1, 2, 3, 4, 5, 6])
result = np.array_split(arr, 4) # 分成4个不等长子数组
参数说明
- 所有分割函数都接受两个主要参数:待分割数组和分割数量
- split函数可额外指定axis参数决定分割方向
- 分割数量必须是能整除对应轴长度的值(array_split除外)
核心要点总结
数组创建按需选择:
np.array()是基础转换方式,zeros/ones/eye用于标准化初始化,arange/linspace生成有序序列,np.random生成随机数数组;有序序列区别:
arange按步长生成(不包含终止值),linspace按元素个数生成(默认包含终止值),reshape可灵活调整数组形状;运算核心:支持标量 / 数组的逐元素向量化运算,矩阵乘法需用
np.dot(),聚合运算通过axis指定按行 / 列计算;索引技巧:二维数组核心格式
[行,列],布尔索引可实现多条件筛选,是数据提取的高效方式;合并分割规则:核心是维度匹配,垂直操作(vstack/vsplit)按行处理,水平操作(hstack/hsplit)按列处理,
concatenate/split是通用型函数;效率原则:尽量使用 NumPy 内置函数和向量化运算,避免编写 Python 循环,这是 NumPy 高效的关键
更多推荐


所有评论(0)