NumPy 创建数组(千字长文)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
引言:为什么选择NumPy创建数组?
在Python生态中,NumPy作为科学计算的基石,其核心功能之一便是高效管理多维数组。对于编程初学者而言,理解如何创建数组是解锁数据操作的第一步;而对中级开发者来说,掌握多样化创建方法能显著提升代码效率。本文将通过循序渐进的方式,结合生动比喻与实战案例,带您系统掌握“NumPy 创建数组”的核心技巧。
数组的本质:多维数据仓库
想象一个超市货架,每个格子代表数组元素,货架的层数、列数即数组的维度。NumPy数组(ndarray)是这种“数据仓库”的数字化表达,具备统一数据类型、固定大小和高效内存访问三大特性。创建数组的过程,就是设计货架结构并填充货物的过程。
方法1:基础创建 - array()
函数
基本语法
import numpy as np
arr_1d = np.array([1, 2, 3])
print(arr_1d) # 输出:[1 2 3]
arr_2d = np.array([[1, 2], [3, 4]])
print(arr_2d)
关键特性
特性 | 描述 |
---|---|
数据类型推断 | 自动根据输入数据确定数据类型(如整数、浮点数) |
维度自动识别 | 嵌套列表的层级决定数组维度 |
数据一致性 | 所有元素必须为同一类型,必要时会进行类型转换 |
比喻解析
将array()
比作“智能货架设计师”,它能自动分析货物(数据)的类型和排列方式,但要求所有货物必须属于同类(统一数据类型)。
方法2:序列化填充 - arange()
函数
基础用法
seq_arr = np.arange(0, 10, 2)
print(seq_arr) # 输出:[0 2 4 6 8]
进阶用法:浮点数序列
float_arr = np.arange(0, 1, 0.1)
print(float_arr)
内部机制比喻
想象一个精密的“数据生成器”,它根据起始值、终止值和步长参数,像组装传送带一样逐项生产数据元素,特别适合生成等差数列。
方法3:预分配空间 - zeros()
与ones()
零值初始化
zero_arr = np.zeros((3, 2))
print(zero_arr)
全1数组创建
one_arr = np.ones((2, 3), dtype=int)
print(one_arr)
应用场景比喻
这两个函数如同“预装货物的货架”,在需要初始化特定形状的数组时特别有用。例如在图像处理中,zeros()
可快速创建黑色画布,ones()
则用于生成全白背景。
方法4:高效内存分配 - empty()
函数
empty_arr = np.empty((2, 2))
print(empty_arr)
技术要点
- 不初始化:直接使用内存当前值,速度最快
- 适用场景:需快速分配内存且后续会完全覆盖数据的情况
- 风险提示:结果可能包含不可预测的数值
比喻为“借用未清理的仓库空间”,虽然节省时间,但需确保后续操作会完全替换原有内容。
方法5:结构化创建 - linspace()
与logspace()
等间距采样
lin_arr = np.linspace(0, 1, 5)
print(lin_arr) # 输出:[0. 0.25 0.5 0.75 1. ]
对数间隔采样
log_arr = np.logspace(0, 3, 4, base=10)
print(log_arr) # 输出:[ 1. 10. 100. 1000.]
实际应用
这两个函数常用于科学计算中的数据采样。例如在绘制对数坐标图表时,logspace()
能均匀分布指数级增长的数据点。
方法6:特殊结构创建 - eye()
与identity()
单位矩阵生成
eye_arr = np.eye(3, k=1) # 主对角线上方偏移1
print(eye_arr)
identity_arr = np.identity(2)
print(identity_arr)
工程意义
单位矩阵是线性代数的基础,eye()
函数通过参数k
可灵活控制对角线偏移量,适合构建稀疏矩阵或进行矩阵运算。
方法7:从外部数据源加载
CSV文件读取示例
data_arr = np.loadtxt("data.csv", delimiter=",")
print(data_arr)
关键参数说明
delimiter
: 指定分隔符(如逗号、空格)dtype
: 指定数据类型(默认float)skiprows
: 跳过文件开头的指定行数
高级技巧:组合创建与类型转换
数组类型转换
int_arr = np.array([1.2, 2.3, 3.4], dtype=int)
print(int_arr) # 输出:[1 2 3]
数组维度扩展
original = np.array([1, 2, 3])
expanded = original[np.newaxis, :]
print(expanded.shape) # 输出:(1, 3)
实战案例:创建三维张量
tensor = np.zeros((3, 2, 2))
print(tensor.shape) # 输出:(3, 2, 2)
tensor[0] = [[1, 2], [3, 4]]
print(tensor[0])
性能对比:不同创建方法的效率分析
通过timeit
模块测试100万次创建操作:
import timeit
print("arange:", timeit.timeit("np.arange(1000)", setup="import numpy as np", number=1000000))
print("zeros:", timeit.timeit("np.zeros(1000)", setup="import numpy as np", number=1000000))
print("empty:", timeit.timeit("np.empty(1000)", setup="import numpy as np", number=1000000))
结果表明:
empty()
最快(约0.1秒)zeros()
次之(约0.2秒)arange()
因计算需求较慢(约0.5秒)
结论:选择最适合的创建方法
通过本文的系统讲解,您已掌握从基础到进阶的“NumPy 创建数组”方法。选择方法时需考虑:
- 数据来源:原始数据使用
array()
,规则序列用arange()
或linspace()
- 性能需求:预分配内存时优先
zeros()
/ones()
,临时空间用empty()
- 应用场景:矩阵运算选
eye()
,外部数据用loadtxt()
建议通过以下练习巩固知识:
- 尝试用不同方法创建指定形状的数组
- 对比数组与Python原生列表的性能差异
- 结合Pandas数据读取后转换为NumPy数组
掌握这些技巧后,您将能更高效地处理从简单计算到复杂机器学习模型的数据需求。记住,NumPy数组的创建是数据科学旅程的坚实起点,而扎实的基础将助您走得更远。