深入解析 numpy 中 np.array() 与 np.asarray() 的区别及 .tolist 用法

追风的人
追风的人
发布时间:2026-10-13 | 3人浏览过
原创

本文详细对比了 numpy 中 np.array() 与 np.asarray() 在输入为列表和数组时的行为差异,重点指出当输入已是 ndarray 时,array 会复制副本而 asarray 不会。同时介绍了将 ndarray 转换为 list 的 .tolist 方法及其在序列化场景下的应用价值。

np.array 与 np.asarray 的核心区别

np.array 和 np.asarray 均用于将结构数据转换为 ndarray 格式,但核心区别在于内存处理机制。当输入数据源已经是 ndarray 时,np.array 会创建一个全新的副本,从而占用额外的内存空间;而 np.asarray 则尽量保持原数据,不生成副本,从而节省内存。

输入为列表时的行为

1. 当输入数据为列表时


a=[[1,2,3],[4,5,6],[7,8,9]]
b=np.array(a)
c=np.asarray(a)
a[2]=1
print(a)
print(b)
print(c)

在此场景下,np.array 与 np.asarray 的功能表现一致,均将输入列表转换为矩阵格式。需要注意的是,修改原始列表中的元素值,并不会影响已经转换生成的矩阵数据,两者在此情况下均表现出独立性。

输入为数组时的行为差异

2. 当输入数据为数组(ndarray)时


a=np.random.random((3,3))
print(a.dtype)
b=np.array(a,dtype='float64')
c=np.asarray(a,dtype='float64')
a[2]=2
print(a)
print(b)
print(c)

通过上述结果可以清晰看出两者的关键差异:当输入为数组时,np.array 执行的是拷贝操作,生成独立副本;而 np.asarray 执行的是视图(view)操作,指向同一内存区域。因此,随着原始输入数据的改变,np.array 的输出结果保持不变,而 np.asarray 的输出会随之变化。此外,若在 np.asarray 中指定类型转换(例如将 float64 转为 float32),则生成的新数组将拥有独立内存,此时即使原始输入改变,np.asarray 的输出也不会再发生变化。

数组转列表的方法与应用场景

3. 将 array 类型转换为 list 类型


a=np.random.random((3,3))
print(a.dtype)
b=a.tolist()
a[1]=2
print(a)
print(b)

如上所示,.tolist 方法用于将 numpy 数组转换为 Python 原生 list 格式,这可以视为 np.array 操作的逆过程。那么,何时需要将 np.ndarray 转换为 list 呢?主要场景涉及数据序列化(serialization)。由于 np.ndarray 对象本身不支持标准的序列化操作,因此在需要持久化存储或网络传输前,通常需先将其转换为 list 格式。

OpenCV 字符串格式化补充

补充知识:OpenCV 中将 int 类型数字转换为固定长度字符串的方法 cv::format


int currentFrame = 2;

stringstream frame_name;
frame_name << cv::format("%.3d",currentFrame) << ".jpg";

或者采用以下写法:

String save_frame_path; save_frame_path = cv::format("%.3d", frame_num) + ".jpg";

以上关于 numpy 中 np.array() 与 np.asarray() 的区别以及 .tolist 用法的解析即为全部内容,希望能为读者提供有效的参考。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表