NumPy 库快速上手:从基础到实战,搞定 Python 数值计算
NumPy(Numerical Python)是 Python 科学计算的核心库,它提供了高性能的多维数组对象(ndarray)以及一系列用于数组操作的函数,相比 Python 原生列表,NumPy 数组在数值计算、数据处理上效率提升显著。本文将从 NumPy 的核心属性、数组创建、基础运算、索引、合并与分割六个核心维度,带你快速掌握 NumPy 的基础用法,适合刚接触 NumPy 的新手入门。
1. NumPy 核心属性
在使用 NumPy 前,首先需要导入库(约定俗成使用np作为别名):
import numpy as np
创建一个基础数组后,我们可以通过 NumPy 的核心属性快速了解数组的关键信息:
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 1. ndim:数组的维度(秩)
print("数组维度:", arr.ndim) # 输出:2(二维数组)
# 2. shape:数组的形状(行×列),返回元组
print("数组形状:", arr.shape) # 输出:(2, 3)(2行3列)
# 3. size:数组中元素的总个数
print("元素总数:", arr.size) # 输出:6
# 4. dtype:数组中元素的数据类型
print("元素类型:", arr.dtype) # 输出:int64(默认整数类型,根据系统可能为int32)
关键说明:
shape是最常用的属性之一,修改shape可以改变数组维度(如arr.shape = (3,2)会将 2 行 3 列数组转为 3 行 2 列);dtype支持指定创建数组的类型,如np.array([1,2], dtype=np.float32)
2. NumPy 数组的创建
NumPy 提供了丰富的数组创建方式,不同方式适用于不同场景,以下是新手必须掌握的核心方法:
2.1 基础创建:np.array ()
这是最基础的创建方式,直接将 Python 列表 / 元组转换为 NumPy 数组,支持指定数据类型。
# 1. 创建一维数组
arr1 = np.array([1, 2, 3, 4])
print("一维数组:", arr1) # 输出:[1 2 3 4]
print("数组类型:", arr1.dtype) # 输出:int64
# 2. 创建二维数组(嵌套列表)
arr2 = np.array([[1, 2], [3, 4], [5, 6]])
print("二维数组:\n", arr2)
# 输出:
# [[1 2]
# [3 4]
# [5 6]]
# 3. 指定数据类型
arr3 = np.array([1, 2, 3], dtype=np.float32)
print("指定float32类型:", arr3, "类型:", arr3.dtype)
# 输出:[1. 2. 3.] 类型:float32
2.2 特殊值数组:zeros/ones/empty/eye
这类方法用于创建固定值的特殊数组,是数值计算中最常用的初始化方式。
2.2.1 np.zeros ():全 0 数组
创建指定形状的全 0 数组,默认float64类型,可通过dtype指定类型。
# 1. 创建一维全0数组
zeros_1d = np.zeros(5)
print("一维全0数组:", zeros_1d) # 输出:[0. 0. 0. 0. 0.]
# 2. 创建二维全0数组(传入形状元组)
zeros_2d = np.zeros((3, 4))
print("3行4列全0数组:\n", zeros_2d)
# 输出:
# [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]
2.2.2 np.ones ():全 1 数组
用法与zeros()完全一致,只是数组元素全为 1。
# 创建2行3列的int类型全1数组
ones_arr = np.ones((2, 3), dtype=np.int64)
print("全1数组:\n", ones_arr)
# 输出:
# [[1 1 1]
# [1 1 1]]
2.2.3 np.empty ():空数组
创建指定形状的 “空” 数组,数组元素为内存中随机值(非真正空),速度比 zeros/ones 快,适合后续要赋值的场景。
empty_arr = np.empty((2, 2))
print("空数组(随机值):\n", empty_arr)
# 输出示例(值不固定):
# [[4.67296746e-307 1.69121096e-306]
# [1.37961641e-306 9.79054228e-307]]
2.3 数值序列:arange/linspace
用于创建有序的数值序列数组,替代 Python 原生range,支持浮点数。
2.3.1 np.arange ():固定步长序列
语法:np.arange(start, stop, step, dtype=None)
start:起始值(默认 0)stop:终止值(不包含)step:步长(默认 1)# 1. 基础用法:0到9(不包含10) arr1 = np.arange(10) print("0-9序列:", arr1) # 输出:[0 1 2 3 4 5 6 7 8 9] # 2. 指定起始和终止:5到14 arr2 = np.arange(5, 15) print("5-14序列:", arr2) # 输出:[ 5 6 7 8 9 10 11 12 13 14] # 3. 指定步长:0到10,步长2 arr3 = np.arange(0, 11, 2) print("0-10步长2:", arr3) # 输出:[ 0 2 4 6 8 10] # 4. 浮点数步长:0到1,步长0.2 arr4 = np.arange(0, 1, 0.2) print("浮点数步长:", arr4) # 输出:[0. 0.2 0.4 0.6 0.8] # 5. 重塑为二维数组 arr5 = np.arange(12).reshape(3, 4) print("重塑为3行4列:\n", arr5) # 输出: # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11]]2.3.2 np.linspace ():固定个数序列
语法:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)start:起始值stop:终止值(默认包含,endpoint=False则不包含)num:生成的元素个数(默认 50)retstep:是否返回步长(默认 False)# 1. 基础用法:0到10,生成5个均匀数(包含10) lin1 = np.linspace(0, 10, num=5) print("0-10生成5个数:", lin1) # 输出:[ 0. 2.5 5. 7.5 10. ] # 2. 不包含终止值:0到10,生成5个数 lin2 = np.linspace(0, 10, num=5, endpoint=False) print("不包含10:", lin2) # 输出:[0. 2. 4. 6. 8.] # 3. 返回步长:获取生成的数和步长 lin3, step = np.linspace(0, 10, num=5, retstep=True) print("数值序列:", lin3, "步长:", step) # 输出:[ 0. 2.5 5. 7.5 10. ] 步长:2.5 # 4. 生成后重塑为二维数组 lin4 = np.linspace(1, 10, num=9).reshape(3, 3) print("3行3列等差数列:\n", lin4) # 输出: # [[ 1. 2.125 3.25 ] # [ 4.375 5.5 6.625] # [ 7.75 8.875 10. ]]2.4 随机数数组:np.random(基础)
生成随机数数组是数据分析、模拟实验的常用操作,这里介绍最基础的两种:
# 1. np.random.random():0到1之间的随机浮点数 random_arr = np.random.random((2, 3)) print("0-1随机浮点数数组:\n", random_arr) # 输出示例: # [[0.456 0.789 0.123] # [0.876 0.345 0.678]] # 2. np.random.randint():指定范围的随机整数 # 语法:randint(low, high=None, size=None) int_arr = np.random.randint(0, 10, size=(3, 3)) # 0到9的随机整数,3×3 print("0-9随机整数数组:\n", int_arr) # 输出示例: # [[5 8 2] # [7 1 9] # [3 4 6]]3. NumPy 基础运算
NumPy 支持数组与标量、数组与数组之间的快速运算,无需循环,效率极高。
3.1 数组与标量运算
数组加减乘除标量时,会对每个元素执行相同操作:
arr = np.array([[1, 2, 3], [4, 5, 6]]) # 加法 print("数组+2:\n", arr + 2) # 输出: # [[3 4 5] # [6 7 8]] # 乘法 print("数组×3:\n", arr * 3) # 输出: # [[ 3 6 9] # [12 15 18]] # 平方 print("数组平方:\n", arr **2) # 输出: # [[ 1 4 9] # [16 25 36]] # 三角函数(以sin为例) print("数组sin值:\n", np.sin(arr)) # 输出: # [[ 0.84147098 0.90929743 0.14112001] # [-0.7568025 -0.95892427 -0.2794155 ]]3.2 数组与数组运算
同形状数组
arr1 = np.array([[1, 2], [3, 4]]) arr2 = np.array([[5, 6], [7, 8]]) # 加法 print("数组相加:\n", arr1 + arr2) # 输出: # [[ 6 8] # [10 12]] # 乘法(对应元素相乘,非矩阵乘法) print("对应元素相乘:\n", arr1 * arr2) # 输出: # [[ 5 12] # [21 32]] # 矩阵乘法(需用dot函数) print("矩阵乘法:\n", arr1.dot(arr2)) # 输出: # [[19 22] # [43 50]]运算时,对应位置元素两两计算:
3.3 聚合运算
对数组整体或按轴计算最大值、最小值、求和等:
arr = np.array([[1, 2, 3], [4, 5, 6]]) print("数组最大值:", arr.max()) # 6 print("数组最小值:", arr.min()) # 1 print("数组求和:", arr.sum()) # 21 # 按轴运算(axis=0:列,axis=1:行) print("按列求最大值:", arr.max(axis=0)) # [4 5 6] print("按行求和:", arr.sum(axis=1)) # [ 6 15]4. NumPy 索引
NumPy 支持类似 Python 列表的索引方式,同时支持多维数组的精准索引。
4.1 一维数组索引
与 Python 列表完全一致:
arr = np.linspace(0, 10, num=6) # [ 0. 2. 4. 6. 8. 10.] print("索引第3个元素:", arr[2]) # 4.0 print("切片(1到4,步长2):", arr[1:4:2]) # [2. 6.] print("反向索引:", arr[-1]) # 10.04.2 二维数组索引
格式为
arr[行索引, 列索引],支持单独索引行 / 列、切片:arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 索引第2行第3列元素 print("单个元素:", arr[1, 2]) # 6 # 索引第1行所有元素 print("第1行:", arr[0, :]) # [1 2 3] # 索引第2列所有元素 print("第2列:", arr[:, 1]) # [2 5 8] # 切片:前2行,后2列 print("切片结果:\n", arr[:2, 1:]) # 输出: # [[2 3] # [5 6]] # 布尔索引(筛选大于5的元素) print("大于5的元素:", arr[arr > 5]) # [6 7 8 9]5. NumPy 数组合并
NumPy 提供
concatenate、vstack、hstack等函数实现数组合并,核心是保证合并维度的一致性。5.1 垂直合并(vstack)
按行合并(上下拼接),要求列数相同:
arr1 = np.array([[1, 2], [3, 4]]) arr2 = np.array([[5, 6], [7, 8]]) # 垂直合并 v_arr = np.vstack((arr1, arr2)) print("垂直合并:\n", v_arr) # 输出: # [[1 2] # [3 4] # [5 6] # [7 8]]5.2 水平合并(hstack)
按列合并(左右拼接),要求行数相同:
# 水平合并 h_arr = np.hstack((arr1, arr2)) print("水平合并:\n", h_arr) # 输出: # [[1 2 5 6] # [3 4 7 8]]5.3 通用合并(concatenate)
np.concatenate是 NumPy 中最通用的数组合并函数,通过axis参数指定合并轴,可适配一维、二维等多维度合并场景,是vstack/hstack的底层实现。-
5.3.1 核心语法
np.concatenate((arr1, arr2, ...), axis=0) -
关键参数:
(arr1, arr2, ...):待合并的数组序列(需放入元组 / 列表);axis:合并轴,默认axis=0(垂直 / 行方向),axis=1(水平 / 列方向);- 核心要求:除合并轴外,其他轴的形状必须一致。
-
5.3.2 核心场景示例
场景 1:二维数组垂直合并(axis=0)
要求待合并数组列数相同,沿行方向拼接:
-
arr1 = np.array([[1, 2], [3, 4]]) # shape=(2,2) arr2 = np.array([[5, 6], [7, 8]]) # shape=(2,2) concat_v = np.concatenate((arr1, arr2), axis=0) print("垂直合并结果:\n", concat_v) # 输出: # [[1 2] # [3 4] # [5 6] # [7 8]]场景 2:二维数组水平合并(axis=1)
要求待合并数组行数相同,沿列方向拼接:
-
concat_h = np.concatenate((arr1, arr2), axis=1) print("水平合并结果:\n", concat_h) # 输出: # [[1 2 5 6] # [3 4 7 8]]5.4 合并函数对比(vstack/hstack/concatenate)
函数 适用维度 合并方向 等价 concatenate 写法 核心要求 np.vstack 一维 / 二维 垂直(行) np.concatenate(..., axis=0) 列数相同 np.hstack 一维 / 二维 水平(列) np.concatenate(..., axis=1) 行数相同 np.concatenate 任意维度 任意轴(axis) - 除合并轴外,其他轴形状一致 -
6. NumPy 数组分割
数组分割是合并的逆操作,常用
split、vsplit、hsplit函数,需指定分割份数或分割点。6.1 垂直分割(vsplit)
按行分割,要求行数能被分割份数整除:
arr = np.arange(12).reshape(6, 2) # 6行2列数组 print("原始数组:\n", arr) # 垂直分割为3份 v_split_arr = np.vsplit(arr, 3) print("垂直分割结果:") for i in v_split_arr: print(i) # 输出: # [[0 1]] # [[2 3]] # [[4 5] # [6 7] # [8 9] # [10 11]] → 注:6行分割为3份,每份2行6.2 水平分割(hsplit)
按列分割,要求列数能被分割份数整除:
arr = np.arange(12).reshape(3, 4) # 3行4列数组 print("原始数组:\n", arr) # 水平分割为2份 h_split_arr = np.hsplit(arr, 2) print("水平分割结果:") for i in h_split_arr: print(i) # 输出: # [[0 1] # [4 5] # [8 9]] # [[ 2 3] # [ 6 7] # [10 11]]6.3 自定义分割(split)
通过
axis指定分割轴,同时支持指定分割点:arr = np.arange(10) # 按分割点[3,7]分割为3部分(0-2, 3-6,7-9) split_arr = np.split(arr, [3,7]) print("自定义分割:", split_arr) # 输出:[array([0, 1, 2]), array([3, 4, 5, 6]), array([7, 8, 9])]总结
- NumPy 数组创建方式丰富:
np.array()是基础,zeros/ones用于初始化,arange/linspace生成有序序列,random生成随机数; arange按步长生成序列(不包含终止值),linspace按个数生成序列(默认包含终止值),可根据需求选择;- 数组核心属性(ndim/shape/size/dtype)是操作数组的基础,
reshape可灵活调整数组维度; - 基础运算支持标量 / 数组运算,聚合运算可按轴计算,矩阵乘法需用
dot函数; - 索引支持单元素、切片、布尔索引,二维数组索引格式为
[行,列]; - 数组合并 / 分割需保证维度匹配,垂直操作(vstack/vsplit)按行,水平操作(hstack/hsplit)按列。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)