📌 写在前面
大家好!👋
欢迎来到**【一起学Python】**的第78天!
前四天我们打下了坚实基础:安装环境 → 认识ndarray → 掌握数据类型 → 熟悉数组属性。今天,我们正式进入实战第一步:如何高效创建NumPy数组?
🤔 为什么要学创建数组?
- ✅ 数据分析的第一步永远是构造数据
- ✅ 手动敲数据太慢?NumPy提供秒级生成百万级数据的能力
- ✅ 掌握不同创建方式,能避开90%的初始值错误
- ✅ 为后续的切片、运算、建模铺平道路
今天你将学到:
- 🔸 从Python对象快速转换数组
- 🔸
arange vs linspace 的核心区别 - 🔸 特殊数组(zeros/ones/empty)的正确用法
- 🔸 随机数生成的实战技巧与可重复性设置
准备好了吗?让我们开始吧!👇
一、从已有数据创建数组
1.1 最基础:从列表/元组创建
import numpy as np# 从列表创建一维数组arr1 = np.array([1, 2, 3, 4, 5])print("一维数组:", arr1)# 从嵌套列表创建二维数组arr2 = np.array([[1, 2, 3], [4, 5, 6]])print("二维数组:\n", arr2)
💡 关键提醒:
np.array() 默认会复制数据,修改新数组不会影响原列表- 如果数据量极大,建议直接使用NumPy原生创建函数,避免Python列表转换的内存开销
二、从数值范围创建数组
2.1 arange():类似Python的range,但更强大
# 创建0~9的数组arr_arange = np.arange(10)print("arange(10):", arr_arange)# 指定起始、终止、步长arr_step = np.arange(0, 10, 2)print("步长为2:", arr_step) # [0 2 4 6 8]
⚠️ 注意:arange不包含终止值(类似Python的range)
2.2 linspace():均匀采样,数据分析最爱
# 在0~1之间均匀生成5个数arr_linspace = np.linspace(0, 1, 5)print("linspace:", arr_linspace)# 输出: [0. 0.25 0.5 0.75 1. ]
┌────────────┬──────────────┬──────────────┐│ 函数 │ 控制参数 │ 适用场景 │├────────────┼──────────────┼──────────────┤│ arange │ 步长(step) │ 整数索引、循环││ linspace │ 元素个数(num)│ 画图、等距采样│└────────────┴──────────────┴──────────────┘
💡 避坑指南:当步长是浮点数时,arange可能因精度问题少生成一个元素!此时强烈建议改用linspace。三、创建特殊数组 ⚡
3.1 全零、全一、自定义填充
# 全零数组(2行3列)zeros_arr = np.zeros((2, 3))print("全零数组:\n", zeros_arr)# 全一数组(3行2列)ones_arr = np.ones((3, 2))print("全一数组:\n", ones_arr)# 自定义填充值(超实用!)full_arr = np.full((2, 3), fill_value=99)print("填充99的数组:\n", full_arr)
3.2 empty():速度最快,但需小心!
empty_arr = np.empty((2, 2))print("未初始化数组:\n", empty_arr)# 输出:内存中的随机垃圾值(每次运行不同)
⚠️ 核心区别:
zeros/ones/full:会初始化内存,安全但稍慢empty:不初始化,直接分配内存,速度最快,但值不可控!- ✅ 使用场景:当你确定会立刻覆盖所有元素时,用
empty提升性能
四、随机数生成:数据分析的“盲盒” 🎲
NumPy的random模块是模拟数据、机器学习初始化的核心工具。
4.1 三种常用随机分布
# 1. 均匀分布 [0, 1)rand_arr = np.random.rand(2, 3)print("均匀分布:\n", rand_arr)# 2. 标准正态分布(均值0,标准差1)randn_arr = np.random.randn(3, 2)print("正态分布:\n", randn_arr)# 3. 指定范围随机整数 [low, high)randint_arr = np.random.randint(0, 10, (2, 3))print("随机整数:\n", randint_arr)
4.2 必学技巧:设置随机种子 🔑
np.random.seed(42) # 固定随机种子seed_arr1 = np.random.rand(3)print("第一次运行:", seed_arr1)np.random.seed(42) # 再次设置相同种子seed_arr2 = np.random.rand(3)print("第二次运行:", seed_arr2)# 输出完全相同!这对模型复现、调试至关重要 ✅
应用场景:
- 机器学习划分训练/测试集
- 神经网络权重初始化
- 蒙特卡洛模拟实验
今日作业
基础题 ⭐
- 使用
np.arange创建0~20,步长为3的数组 - 使用
np.linspace创建1~10之间包含8个元素的数组 - 创建一个3×4的全零数组,并将其数据类型指定为
float32
进阶题 ⭐
- 使用
np.random.randint生成一个5×5的矩阵,元素范围[1, 100] - 设置随机种子为
100,生成3个随机数,记录结果 - 对比
np.zeros((1000,1000))和np.empty((1000,1000))的创建时间(使用time模块)
挑战题 ⭐⭐
- 用
np.empty创建一个形状为(2, 3)的数组,然后用循环将其填充为[[1,2,3],[4,5,6]] - 编写一个函数:输入
(start, stop, num),自动判断用arange还是linspace更合适 - 生成1000个服从正态分布的随机数,计算它们的均值和标准差(验证是否接近0和1)
💡 参考代码:
import numpy as npimport time# 基础题arr1 = np.arange(0, 20, 3)arr2 = np.linspace(1, 10, 8)arr3 = np.zeros((3, 4), dtype=np.float32)# 进阶题matrix = np.random.randint(1, 100, (5, 5))np.random.seed(100)rand_nums = np.random.rand(3)print("随机数:", rand_nums)# 性能对比start = time.time()_ = np.zeros((1000, 1000))print(f"zeros耗时: {time.time()-start:.4f}秒")start = time.time()_ = np.empty((1000, 1000))print(f"empty耗时: {time.time()-start:.4f}秒")
🎓 明日预告
第79天:NumPy切片与索引进阶
你将学到:
- 🔸 多维数组的切片语法精髓
- 🔸 布尔索引:按条件筛选数据
- 🔸 花式索引:高级数据提取技巧
- 🔸 实战:从Excel表格思维到NumPy索引思维
敬请期待!
💡 学习小贴士
- 创建选择指南:
- 等差序列 →
arange - 等分采样 →
linspace - 占位初始化 →
zeros(安全) / empty(极速) - 模拟数据 →
random 系列
- 性能优化:
- 创建大数组时,先分配后填充,避免循环中
append - 始终在创建时指定
dtype,避免后续转换开销
- 调试技巧:
- 随机结果不一致?检查是否漏了
np.random.seed() empty输出奇怪的值?这是正常的!记得用zeros替代
📚 学习路线图
第74天:NumPy安装 ✓第75天:ndarray对象 ✓第76天:数据类型 ✓第77天:数组属性 ✓第78天:创建数组 ✓ ← 你今天在这里第79天:切片和索引第80天:数组运算第81天:广播机制...
💬 写在最后
创建数组是数据分析的起手式,掌握这些方法,你就能:
✅ 秒级构造百万级测试数据✅ 精准控制初始值与分布✅ 为后续计算打下坚实基础
今天重点掌握:
- ✅
arange 与 linspace 的场景选择 - ✅
empty 的性能优势与使用边界 - ✅ 随机种子的可重复性价值
如果觉得有用,记得:
- 👍 点赞支持一下
- ⭐ 收藏方便复习
- 📤 分享给更多小伙伴
完成作业的同学,欢迎在评论区打卡! 💪
【一起学Python】每天进步一点点,365天后遇见更优秀的自己!
关注公众号,不错过每天的学习内容!
🎯 今日金句:
"好数据是算出来的,好数组是创出来的。掌握创建技巧,让数据为你所用!" 🛠️
明天见! 🌟