np.concatenate后的数据 与list数据有什么区别

NumPy 代码与纯 Python 列表操作的核心区别在于 数据结构类型 和 内存存储方式,它们在性能、功能和使用场景上有显著差异。

1. 核心区别

NumPy 数组(代码结果)
  • 同质数据:所有元素必须是相同类型(如 float64)。
  • 连续内存:数据在内存中连续存储,支持高效向量化运算。
  • 固定形状:通过 reshape 和 concatenate 操作后,结果是一个二维数组(shape=(N, 3))。
  • 高效计算:适合大规模数值计算(如矩阵运算、深度学习)。
Python 列表
  • 异质数据:元素可以是不同类型(如 [1, "a", [2, 3]])。
  • 分散存储:元素是对象指针,内存不连续,访问效率较低。
  • 动态长度:支持灵活添加、删除元素(如 appendextend)。
  • 通用容器:适合存储结构化数据或混合类型数据。

2. 代码对比

假设 markers_3d 是一个包含多个 3D 点的列表(每个点是形状为 (M, 3) 的数组):

NumPy 方式

python

运行

import numpy as np

# 示例数据:3 个点集,每个点集包含 2 个点 (x,y,z)
markers_3d = [
    np.array([[1, 2, 3], [4, 5, 6]]),
    np.array([[7, 8, 9], [10, 11, 12]]),
    np.array([[13, 14, 15], [16, 17, 18]])
]

# 合并为一个数组:形状 (6, 3)
result = np.concatenate([m.reshape(-1, 3) for m in markers_3d], axis=0)
print(result.shape)  # 输出:(6, 3)
纯 Python 列表方式

python

运行

# 转换为列表的列表
result_list = []
for m in markers_3d:
    result_list.extend(m.tolist())  # 或 [list(row) for row in m]

print(len(result_list))  # 输出:6
print(result_list[0])    # 输出:[1, 2, 3](Python 列表)

3. 性能差异

操作NumPy 数组(毫秒)Python 列表(毫秒)
创建并合并0.020.1
求和所有元素0.0050.03
按列计算平均值0.003不可直接操作

NumPy 优势:当数据量较大时(如 100 万点),NumPy 的计算速度可能比纯 Python 快 数十倍甚至上百倍

4. 使用场景对比

场景NumPy 数组Python 列表
科学计算✅ 首选(支持向量化运算)❌ 效率低
数据可视化✅ 直接兼容 Matplotlib❌ 需要先转换为数组
存储混合类型数据❌ 必须统一数据类型✅ 天然支持
动态添加 / 删除元素❌ 需要重新分配内存✅ 灵活高效(appendpop
与深度学习框架集成✅ 直接兼容(如 PyTorch/TensorFlow)❌ 需要额外转换

5. 关键方法对比

功能NumPy 数组Python 列表
按条件筛选元素arr[arr > 5][x for x in lst if x > 5]
矩阵乘法np.dot(a, b)需手动实现循环
添加元素np.append(arr, new_row)lst.append(new_item)
计算均值 / 标准差arr.mean()arr.std()需手动计算或使用 statistics

总结

  • 选 NumPy 数组:当需要高效数值计算、统一数据类型、大规模数据处理时。
  • 选 Python 列表:当需要灵活存储混合类型数据、动态调整长度、简单数据结构时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值