当前位置:首页>python>【一起学Python】第75天:NumPy核心——ndarray对象详解

【一起学Python】第75天:NumPy核心——ndarray对象详解

  • 2026-10-11 08:39:20
【一起学Python】第75天:NumPy核心——ndarray对象详解

📌 写在前面

大家好!👋

欢迎来到**【一起学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支持哪些数据类型?
  • 🔸 如何查看和转换数据类型?
  • 🔸 不同数据类型的内存占用
  • 🔸 实际应用场景

敬请期待!

💡 学习小贴士

  1. 创建数组:
    • 小数据用np.array()
    • 序列数据用np.arange()
    • 均匀分布用np.linspace()
  2. 访问元素:
    • 单个元素:arr[i, j]
    • 整行:arr[i]
    • 整列:arr[:, j]
  3. 性能优势:
    • 尽量使用向量化运算
    • 避免使用Python循环
    • 善用布尔索引

📚 学习路线图

第74天:NumPy安装 ✓第75天:ndarray对象 ✓ ← 你今天在这里第76天:数据类型第77天:数组属性第78天:创建数组第79天:切片和索引...

💬 写在最后

今天的内容有点多,但都是NumPy的核心基础!

重点掌握:

  • ✅ ndarray的创建方法
  • ✅ 数组的索引和切片
  • ✅ ndarray的性能优势

如果觉得有用,记得:

  • 👍 点赞支持一下
  • ⭐ 收藏方便复习
  • 📤 分享给更多小伙伴

完成作业的同学,欢迎在评论区打卡! 💪

【一起学Python】每天进步一点点,365天后遇见更优秀的自己!

👉 关注公众号,不错过每天的学习内容!

🎯 今日金句:

"ndarray是NumPy的灵魂,掌握它就掌握了数据分析的钥匙!" 🔑

最新文章

随机文章