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 创建数组”方法。选择方法时需考虑:

  1. 数据来源:原始数据使用array(),规则序列用arange()linspace()
  2. 性能需求:预分配内存时优先zeros()/ones(),临时空间用empty()
  3. 应用场景:矩阵运算选eye(),外部数据用loadtxt()

建议通过以下练习巩固知识:

  • 尝试用不同方法创建指定形状的数组
  • 对比数组与Python原生列表的性能差异
  • 结合Pandas数据读取后转换为NumPy数组

掌握这些技巧后,您将能更高效地处理从简单计算到复杂机器学习模型的数据需求。记住,NumPy数组的创建是数据科学旅程的坚实起点,而扎实的基础将助您走得更远。

最新发布