📌 写在前面
大家好!👋
欢迎来到**【一起学Python】**的第75天!
昨天我们成功安装了NumPy,今天我们要深入NumPy的核心——ndarray对象!
🤔 什么是ndarray?
简单来说,ndarray就是NumPy用来存储数据的多维数组,它是NumPy的灵魂!
今天你将学到:
- ✅ ndarray的定义与特性
- ✅ 创建ndarray的6种方法
- ✅ 数组的访问、修改、切片
- ✅ ndarray vs Python列表(性能大比拼!)
准备好了吗?让我们开始吧!🚀
一、ndarray是什么?
1.1 定义
ndarray(N-dimensional array)= N维数组
它是NumPy库中用于存储多维数组的核心对象。
💡 关键特性:
- 同质性:所有元素的数据类型必须相同
- 多维性:可以是1维、2维或更高维度
- 高效性:使用连续的内存块存储
1.2 四大特性
📦 ndarray特性├── 多维性:支持1D、2D、3D...任意维度├── 高效性:连续内存存储,操作超快├── 功能丰富:大量内置函数└── 广播机制:自动扩展数组形状
二、创建ndarray的6种方法 🛠️
方法1:从列表或元组创建(最常用)
import numpy as np# 从列表创建一维数组arr1 = np.array([1, 2, 3, 4])print("一维数组:", arr1)# 输出: [1 2 3 4]# 从嵌套列表创建二维数组arr2 = np.array([[1, 2, 3], [4, 5, 6]])print("二维数组:\n", arr2)# 输出:# [[1 2 3]# [4 5 6]]
方法2:使用arange函数
# 创建一个从0到9的数组arr3 = np.arange(10)print("arange数组:", arr3)# 输出: [0 1 2 3 4 5 6 7 8 9]# 创建从0到9的数组,步长为2arr4 = np.arange(0, 10, 2)print("步长为2:", arr4)# 输出: [0 2 4 6 8]
💡 小贴士:arange(起始, 终止, 步长),类似Python的range()
方法3:使用linspace函数
# 创建一个包含5个均匀分布的数的数组arr5 = np.linspace(0, 1, 5)print("linspace数组:", arr5)# 输出: [0. 0.25 0.5 0.75 1. ]
💡 小贴士:linspace(起始, 终止, 数量),自动生成均匀分布的数方法4:创建特殊数组
# 创建全为0的数组(2行3列)arr6 = np.zeros((2, 3))print("全0数组:\n", arr6)# 输出:# [[0. 0. 0.]# [0. 0. 0.]]# 创建全为1的数组arr7 = np.ones((2, 3))print("全1数组:\n", arr7)# 输出:# [[1. 1. 1.]# [1. 1. 1.]]# 创建未初始化的数组(速度最快)arr8 = np.empty((2, 3))print("未初始化数组:\n", arr8)# 输出: 随机值
方法5:使用随机数生成
# 创建包含5个随机数的数组(0-1之间)arr9 = np.random.rand(5)print("随机数数组:", arr9)# 创建2x3的随机整数数组(0-10之间)arr10 = np.random.randint(0, 10, (2, 3))print("随机整数数组:\n", arr10)# 输出示例:# [[3 7 2]# [9 1 5]]
三、ndarray的基本操作 ✂️
3.1 访问与修改元素
arr = np.array([[1, 2, 3], [4, 5, 6]])# 访问第一行第二列的元素(索引从0开始)print("访问元素:", arr[0, 1]) # 输出: 2# 修改元素arr[0, 1] = 10print("修改后:\n", arr)# 输出:# [[ 1 10 3]# [ 4 5 6]]# 访问整行print("第一行:", arr[0])# 输出: [ 1 10 3]# 访问整列print("第二列:", arr[:, 1])# 输出: [10 5]
💡 索引说明:
arr[0, 1] → 第0行第1列arr[0] → 第0行所有列arr[:, 1] → 所有行第1列
3.2 切片操作
arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])# 基本切片:前两行和前两列sub_array = arr[:2, :2]print("切片:\n", sub_array)# 输出:# [[1 2]# [6 7]]# 步长切片:每隔一个元素print("步长切片:", arr[0, ::2])# 输出: [1 3 5]# 反向切片print("反向:", arr[0, ::-1])# 输出: [5 4 3 2 1]
3.3 布尔索引(超实用!)
arr = np.array([[1, 2, 3], [4, 5, 6]])# 获取大于3的元素bool_idx = arr > 3print("布尔条件:\n", bool_idx)# 输出:# [[False False False]# [ True True True]]print("大于3的元素:", arr[bool_idx])# 输出: [4 5 6]# 简写形式print("大于3的元素:", arr[arr > 3])# 输出: [4 5 6]
3.4 花式索引(Fancy Indexing)
arr = np.array([[1, 2, 3], [4, 5, 6]])# 使用整数数组索引indices = np.array([0, 1])result = arr[indices, [1, 2]]print("花式索引:", result)# 输出: [2 6]# 解释:访问(0,1)和(1,2)的元素
四、ndarray vs Python列表 🥊
4.1 性能大比拼
import timeimport numpy as npsize = 1000000# Python列表py_list = list(range(size))start_time = time.time()py_list = [x * 2 for x in py_list]print("Python列表耗时:", time.time() - start_time)# NumPy数组np_array = np.arange(size)start_time = time.time()np_array = np_array * 2print("NumPy数组耗时:", time.time() - start_time)
📊 测试结果:
- Python列表:约0.1秒
- NumPy数组:约0.001秒
- NumPy快100倍! 🚀
4.2 功能对比
# NumPy数组运算(简洁!)a = np.array([1, 2, 3])b = np.array([4, 5, 6])print("NumPy加法:", a + b)# 输出: [5 7 9]# Python列表运算(繁琐)list_a = [1, 2, 3]list_b = [4, 5, 6]print("Python列表加法:", [x + y for x, y in zip(list_a, list_b)])# 输出: [5, 7, 9]
4.3 核心差异总结
┌─────────────────┬──────────────┬──────────────┐│ 特性 │ Python列表 │ NumPy ndarray│├─────────────────┼──────────────┼──────────────┤│ 数据类型 │ 可混合 │ 必须相同 ││ 内存占用 │ 较大 │ 更小 ││ 运算速度 │ 较慢 │ 快10-100倍 ││ 数学运算 │ 需循环 │ 直接运算 ││ 功能丰富度 │ 基础 │ 超丰富 │└─────────────────┴──────────────┴──────────────┘
📝 今日作业
完成以下练习,巩固今天的学习:
基础题 ⭐
- 创建一个包含1-10的一维数组
- 创建一个3×3的全1矩阵
- 访问二维数组的指定元素
进阶题 ⭐⭐
- 使用arange创建0-20,步长为2的数组
- 使用linspace创建0-1之间10个均匀分布的数
- 找出数组中所有大于5的元素
挑战题 ⭐⭐⭐
- 创建一个5×5的随机整数矩阵(0-100)
- 计算矩阵每行的平均值
- 将矩阵中小于50的元素替换为0
💡 提示代码:
import numpy as np# 基础题示例arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])matrix = np.ones((3, 3))# 进阶题示例arr2 = np.arange(0, 20, 2)arr3 = np.linspace(0, 1, 10)# 挑战题示例matrix = np.random.randint(0, 100, (5, 5))row_means = np.mean(matrix, axis=1)matrix[matrix < 50] = 0
🎓 明日预告
第76天:NumPy数据类型详解
你将学到:
- 🔸 NumPy支持哪些数据类型?
- 🔸 如何查看和转换数据类型?
- 🔸 不同数据类型的内存占用
- 🔸 实际应用场景
敬请期待!
💡 学习小贴士
- 创建数组:
- 小数据用
np.array() - 序列数据用
np.arange() - 均匀分布用
np.linspace()
- 访问元素:
- 单个元素:
arr[i, j] - 整行:
arr[i] - 整列:
arr[:, j]
- 性能优势:
- 尽量使用向量化运算
- 避免使用Python循环
- 善用布尔索引
📚 学习路线图
第74天:NumPy安装 ✓第75天:ndarray对象 ✓ ← 你今天在这里第76天:数据类型第77天:数组属性第78天:创建数组第79天:切片和索引...
💬 写在最后
今天的内容有点多,但都是NumPy的核心基础!
重点掌握:
- ✅ ndarray的创建方法
- ✅ 数组的索引和切片
- ✅ ndarray的性能优势
如果觉得有用,记得:
- 👍 点赞支持一下
- ⭐ 收藏方便复习
- 📤 分享给更多小伙伴
完成作业的同学,欢迎在评论区打卡! 💪
【一起学Python】每天进步一点点,365天后遇见更优秀的自己!
👉 关注公众号,不错过每天的学习内容!
🎯 今日金句:
"ndarray是NumPy的灵魂,掌握它就掌握了数据分析的钥匙!" 🔑