您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Numpy数组与列表怎么使用
## 引言
在Python数据处理领域,`list`(列表)和`numpy.array`(Numpy数组)是最常用的两种数据结构。虽然它们都能存储数据集合,但在底层实现、功能特性和适用场景上存在显著差异。本文将深入探讨二者的使用方法、性能对比及实际应用选择建议。
---
## 一、基础概念对比
### 1. Python列表(List)
- **动态类型**:可混合存储任意数据类型
- **可变长度**:支持动态增减元素
- **实现方式**:CPython中通过指针数组实现
```python
mixed_list = [1, "text", 3.14, True] # 合法列表
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个相同空列表
# 从列表转换
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)
a = [1, 2, 3, 4]
b = a[1:3] # 新列表对象
b[0] = 99 # 不影响原列表
arr = np.array([1, 2, 3, 4])
view = arr[1:3] # 数据视图
view[0] = 99 # 修改原始数组
注意:显式调用
copy()
方法可创建Numpy数组副本
Numpy特有的广播规则允许不同形状数组运算:
arr = np.array([[1], [2], [3]])
result = arr * [10, 20, 30] # 自动广播
# 列表需要循环
lst = [1, 2, 3]
squared_lst = [x**2 for x in lst]
# Numpy直接运算
arr = np.array([1, 2, 3])
squared_arr = arr**2
import sys
lst = list(range(1000))
arr = np.arange(1000)
print(sys.getsizeof(lst)) # 约9024字节
print(arr.nbytes) # 约4000字节(int32)
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秒
append()
/pop()
)# 列表与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) # 创建二维数组
try:
arr = np.array([1, 'a', 2.0]) # 自动转为字符串类型
except ValueError:
print("类型转换异常")
a = np.array([1,2,3])
b = np.array([[1],[2]])
# 解决方案1:调整形状
b_reshaped = b.reshape(-1) # 展平数组
# 解决方案2:使用广播
result = a + b.T # 转置操作
# 对于超大数组,使用特殊数据类型
big_arr = np.zeros(int(1e7), dtype=np.float16) # 半精度浮点
# 创建类似表格的数据结构
dtype = [('name', 'U10'), ('age', 'i4'), ('weight', 'f4')]
data = np.array([('Alice', 25, 55.5)], dtype=dtype)
# 处理超大型文件
arr = np.memmap('large_file.dat', dtype='float32', mode='r', shape=(1000, 1000))
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字,实际字数可能因格式略有浮动)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。