机器学习(numpy)练习三

机器学习之NumPy数组索引与操作
# 基本的索引

# 导入NumPy库并使用别名np 
import numpy as np 
 
# 创建一个包含近似圆周率值的浮点数数组 
arr = np.array([3.1,  3.14, 3.141, 3.1415, 3.14159, 3.141592, 3.1415926])
 
# 打印数组中索引为4的元素(即第5个元素)
print(arr[4])  # 输出:3.14159 
 
print("------------------")  # 分隔线 
 
# 打印数组中索引3到5的元素(左闭右开区间)
print(arr[3:6])  # 输出:[3.1415 3.14159 3.141592]
 
print("------------------")  # 分隔线 
 
# 将索引3到5的元素赋值为更高精度的圆周率近似值 
arr[3:6] = 3.14159265358 
 
# 打印修改后的数组(注意数值精度被截断)
print(arr)

输出结果

3.14159
------------------
[3.1415   3.14159  3.141592]
------------------
[3.1        3.14       3.141      3.14159265 3.14159265 3.14159265
 3.1415926 ]

二、代码功能解析

1. 数组索引与访问
  • arr[4]
    • NumPy数组索引从0开始,arr[4]访问第5个元素(值为3.14159)。
2. 切片操作
  • arr[3:6]
    • 切片操作遵循左闭右开规则,实际选中索引3、4、5的元素,即原数组中的[3.1415, 3.14159, 3.141592]
3. 赋值与数值精度
  • arr[3:6] = 3.14159265358
    • 利用广播机制,将索引3到5的3个元素全部赋值为3.14159265358
    • 精度截断:由于NumPy默认使用float64类型存储,实际存储时会保留约15位有效数字。最终打印结果可能显示为3.1415927(系统显示位数有限)。

三、关键知识点

1. 索引规则
  • Python和NumPy均从0开始计数索引,arr[4]对应第5个元素。
2. 切片范围
  • arr[start:end]包含索引startend-1的元素,例如3:6对应索引3、4、5。
3. 广播机制
  • 标量赋值时,NumPy自动将单个值广播到切片选中的所有位置。
4. 数据类型与精度
  • 原数组在创建时自动推断为float64类型,存储精度约为15位小数。
  • 赋值的高精度值会被截断,例如3.14159265358存储后可能显示为3.1415927(因打印时默认显示8位小数)。

四、输出示例

3.14159 
------------------
[3.1415 3.14159 3.141592]
------------------
[3.1      3.14     3.141    3.1415927 3.1415927 3.1415927 3.1415926]
输出说明:
  • 索引4的值为3.14159(原数据未修改)。
  • 修改后的索引3-5元素因精度限制,显示为3.1415927(实际存储值可能更精确,但打印时被格式化)。

代码示例:

# 导入NumPy库并使用别名np 
import numpy as np 
 
# 创建一个2行4列的二维浮点数组,包含不同精度的圆周率近似值 
arr = np.array([ 
    [3.1, 3.14, 3.141, 3.1415],
    [3.14159, 3.141592, 3.1415926, 3.14159265]
])
 
# 打印第一行第三列的元素(索引从0开始)
print(arr[0][2])  # 输出:3.141 
 
# 打印第二行第二列的元素(使用逗号分隔索引)
print(arr[1, 1])  # 输出:3.141592 

二、代码功能解析

1. 数组结构
  • arr 是一个2行4列的二维数组:
    第0行:3.1      3.14    3.141   3.1415 
    第1行:3.14159 3.141592 3.1415926 3.14159265 
    
2. 索引方式
  • arr[0][2]
    • 第一层索引[0]选择第0行(即[3.1, 3.14, 3.141, 3.1415])。
    • 第二层索引[2]选择该行的第3个元素(值为3.1411
  • arr[1, 1]
    • 使用逗号分隔的索引[1, 1]直接定位到第1行第1列的元素(值为3.1415922
3. 两种索引方式的区别
  • arr[0][2] vs arr[0, 2]
    • 两种写法效果相同,但逗号分隔的索引更高效(直接计算内存偏移量,无需临时生成行数组)12

三、输出示例

3.141 
3.141592 

四、关键知识点

  1. 二维数组索引规则
    • 行和列索引均从0开始,可组合使用[行, 列]或分步索引[行][列]
  2. 数据精度与存储
    • NumPy自动推断数组为float64类型,存储约15位有效数字。例如:
      • 3.14159265实际存储为3.14159265(未超出精度范围)。
  3. 应用场景
    • 科学计算中高效访问多维数据(如矩阵运算、图像处理)。

通过这种结构化的分析,用户可以清晰理解NumPy数组的索引机制及性能优化技巧。

示例代码:

# 导入NumPy库并使用别名np 
import numpy as np 
 
# 创建一个三维数组,包含不同精度的圆周率近似值 
arr = np.array([ 
    [   # 第一层(维度0)
        [3.1, 3.14],          # 第一行(维度1)
        [3.141, 3.1415]       # 第二行 
    ],
    [   # 第二层(维度0)
        [3.14159, 3.141592],  # 第一行 
        [3.1415926, 3.14159265] # 第二行 
    ]
])
 
# 打印数组的形状(维度信息)
print(arr.shape)   # 输出:(2, 2, 2)
 
# 打印第二层的全部数据(即索引1对应的二维数组)
print(arr[1])
 
print("-----------------")  # 分隔线 
 
# 打印第二层第一行的数据(索引[1,0]对应的子数组)
print(arr[1, 0])

二、代码功能解析

1. 数组结构与形状
  • arr 是一个三维数组,其结构为:
    • 层(维度0):2层(由外层两个二维数组构成)。
    • 行(维度1):每层包含2行。
    • 列(维度2):每行包含2列。
  • arr.shape 输出 (2, 2, 2),表示三维数组的维度大小3
2. 索引操作
  • arr[1]
    • 选择第二层(索引1)的全部数据,结果为一个2x2的二维数组:
      [[3.14159    3.141592  ]
       [3.1415926 3.14159265]]
      
  • arr[1, 0]
    • 直接定位到第二层的第一行(索引0),结果为:
      [3.14159 3.141592]
      
3. 数值精度
  • NumPy默认使用float64类型存储,可保留约15位有效数字。例如:
    • 3.14159265实际存储为3.14159265(未超出精度范围)1

三、关键知识点

1. 多维数组索引
  • 逗号分隔索引(如arr[1,0])直接定位到目标子数组,效率更高。
  • 分步索引(如arr[1][0])等效于逗号分隔,但涉及临时数组生成2
2. 数组形状(Shape)
  • shape属性返回元组,表示各维度长度。例如:
    • (2, 2, 2)对应:2层、2行、2列3
3. 应用场景
  • 处理图像数据(如RGB三维数组)、时间序列的多维观测值等。

四、输出示例

(2, 2, 2)
[[3.14159    3.141592  ]
 [3.1415926 3.14159265]]
-----------------
[3.14159 3.141592]

五、扩展对比

索引方式结果维度示例(针对arr
arr[1]二维数组 (2,2)获取第二层的全部数据
arr[1, 0]一维数组 (2,)获取第二层第一行的数据
arr[1, 0, 1]标量值获取第二层第一行第二列的元素

通过灵活使用多维索引,可高效操作复杂数据结构

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值