深入解析 numpy 中 np.array() 与 np.asarray() 的区别及 .tolist 用法
本文详细对比了 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 用法的解析即为全部内容,希望能为读者提供有效的参考。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









