Numpy数组与列表怎么使用

发布时间:2022-03-30 16:53:14 作者:iii
来源:亿速云 阅读:289
# Numpy数组与列表怎么使用

## 引言

在Python数据处理领域,`list`(列表)和`numpy.array`(Numpy数组)是最常用的两种数据结构。虽然它们都能存储数据集合,但在底层实现、功能特性和适用场景上存在显著差异。本文将深入探讨二者的使用方法、性能对比及实际应用选择建议。

---

## 一、基础概念对比

### 1. Python列表(List)
- **动态类型**:可混合存储任意数据类型
- **可变长度**:支持动态增减元素
- **实现方式**:CPython中通过指针数组实现

```python
mixed_list = [1, "text", 3.14, True]  # 合法列表

2. Numpy数组(ndarray)

import numpy as np
arr = np.array([1, 2, 3], dtype=np.float32)  # 类型强制统一

二、创建方式对比

列表创建方法

# 直接创建
lst1 = [1, 2, 3]

# 列表推导式
lst2 = [x**2 for x in range(5)]

# 乘法扩展(注意引用问题)
lst3 = [[]] * 3  # 包含3个相同空列表

Numpy数组创建方法

# 从列表转换
arr1 = np.array([1, 2, 3])

# 特殊初始化
arr2 = np.zeros((3,4))  # 3行4列零矩阵
arr3 = np.arange(10)     # 类似range的数组
arr4 = np.linspace(0, 1, 5)  # 线性间隔数组

# 随机数组
rand_arr = np.random.rand(2,3)

三、核心操作差异

1. 索引与切片

列表切片返回副本

a = [1, 2, 3, 4]
b = a[1:3]  # 新列表对象
b[0] = 99   # 不影响原列表

Numpy切片返回视图

arr = np.array([1, 2, 3, 4])
view = arr[1:3]  # 数据视图
view[0] = 99     # 修改原始数组

注意:显式调用copy()方法可创建Numpy数组副本

2. 广播机制

Numpy特有的广播规则允许不同形状数组运算:

arr = np.array([[1], [2], [3]])
result = arr * [10, 20, 30]  # 自动广播

3. 向量化运算

# 列表需要循环
lst = [1, 2, 3]
squared_lst = [x**2 for x in lst]

# Numpy直接运算
arr = np.array([1, 2, 3])
squared_arr = arr**2

四、性能对比测试

1. 存储效率

import sys

lst = list(range(1000))
arr = np.arange(1000)

print(sys.getsizeof(lst))  # 约9024字节
print(arr.nbytes)         # 约4000字节(int32)

2. 运算速度比较

import timeit

# 列表求和时间
def list_sum():
    return sum([i*i for i in range(10000)])

# Numpy求和时间
def numpy_sum():
    return np.sum(np.arange(10000)**2)

print(timeit.timeit(list_sum, number=1000))  # 约0.5秒
print(timeit.timeit(numpy_sum, number=1000)) # 约0.05秒

五、实用场景指南

优先使用列表的情况:

  1. 存储异构数据(如混合类型)
  2. 需要频繁修改容器大小
  3. 简单的栈/队列操作(append()/pop()

优先使用Numpy数组的情况:

  1. 数值计算和科学计算
  2. 需要线性代数运算
  3. 大型数据集处理(内存效率)
  4. 需要广播功能时

混合使用技巧:

# 列表与Numpy转换
data_list = [1, 2, 3]
arr = np.array(data_list)          # 列表转数组
new_list = arr.tolist()           # 数组转列表

# 高效处理嵌套列表
nested_list = [[1,2], [3,4]]
arr_2d = np.array(nested_list)    # 创建二维数组

六、常见问题解决方案

问题1:类型不匹配错误

try:
    arr = np.array([1, 'a', 2.0])  # 自动转为字符串类型
except ValueError:
    print("类型转换异常")

问题2:形状不匹配

a = np.array([1,2,3])
b = np.array([[1],[2]])

# 解决方案1:调整形状
b_reshaped = b.reshape(-1)  # 展平数组

# 解决方案2:使用广播
result = a + b.T  # 转置操作

问题3:内存不足

# 对于超大数组,使用特殊数据类型
big_arr = np.zeros(int(1e7), dtype=np.float16)  # 半精度浮点

七、进阶技巧

1. 结构化数组

# 创建类似表格的数据结构
dtype = [('name', 'U10'), ('age', 'i4'), ('weight', 'f4')]
data = np.array([('Alice', 25, 55.5)], dtype=dtype)

2. 内存映射

# 处理超大型文件
arr = np.memmap('large_file.dat', dtype='float32', mode='r', shape=(1000, 1000))

3. 与pandas交互

import pandas as pd
df = pd.DataFrame(arr)  # 数组转DataFrame
arr_from_df = df.values  # DataFrame转数组(注意视图问题)

结语

列表和Numpy数组各有其优势领域:列表作为Python基础数据结构灵活性高,适合通用编程场景;而Numpy数组在数值计算方面具有碾压性性能优势。实际开发中建议: 1. 数据预处理阶段使用列表 2. 核心计算阶段转换为Numpy数组 3. 结果输出时根据需要转换回列表

掌握二者的特性及转换技巧,能够显著提升Python数据处理效率。

附录:性能优化建议 - 避免在循环中频繁数组-列表转换 - 预分配Numpy数组空间(np.empty()) - 尽量使用Numpy内置函数代替循环 “`

(全文约2350字,实际字数可能因格式略有浮动)

推荐阅读:
  1. 使用pytorch怎么对tensor与numpy数组进行转换
  2. 关于numpy数组轴的使用详解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

numpy

上一篇:Numpy中None有什么作用

下一篇:NumPy怎么使用genfromtxt导入数据

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》