深入解析 NumPy 中 array 与 asarray 的核心差异

星野
星野
发布时间:2026-10-12 | 1人浏览过
原创

在 NumPy 数据处理中,np.array 和 np.asarray 均可将列表等结构转换为 ndarray。两者的核心区别在于处理已有 ndarray 数据源时的内存策略:array 会强制创建副本,而 asarray 则尽量保持引用。理解这一差异对于优化内存使用至关重要。

核心区别:内存拷贝机制

虽然 np.array 和 np.asarray 都能将结构数据转化为 ndarray,但它们在处理数据源时的行为存在显著差异,主要体现在内存分配和数据共享上:

  • 数据源非 ndarray 时:两者行为一致,均会复制元数据并创建新的数组对象。
  • 数据源已是 ndarray 时:np.array 会强制 copy 出副本,占用新的内存空间;而 np.asarray 不会 copy,直接返回原数组的引用(除非指定了 dtype 或 order 等参数导致必须转换)。

场景一:从普通列表转换

当输入数据为普通列表(List)时,由于列表本身不是 ndarray,array 和 asarray 都会执行复制操作,生成独立的数组对象。修改原始列表不会影响生成的数组。

import numpy as np 

# example 1: 数据源为普通列表
data1 = [[1,1,1],[1,1,1],[1,1,1]] 
arr2 = np.array(data1) 
arr3 = np.asarray(data1) 

# 修改原始列表
data1[1][1] = 2 

print('data1:\n', data1) 
print('arr2:\n', arr2) 
print('arr3:\n', arr3)

运行结果如下:

data1: 
[[1, 1, 1], [1, 2, 1], [1, 1, 1]] 
arr2: 
[[1 1 1] 
 [1 1 1] 
 [1 1 1]] 
arr3: 
[[1 1 1] 
 [1 1 1] 
 [1 1 1]]

可以看到,修改 data1 后,arr2 和 arr3 均保持不变,因为它们都获得了原始数据的副本。

场景二:从 ndarray 转换

这是两者差异最关键的场景。当输入数据已经是 ndarray 时,np.array 会强制创建副本,而 np.asarray 则返回原数组的视图(View)或引用。

import numpy as np 

# example 2: 数据源为 ndarray
arr1 = np.ones((3,3)) 
arr2 = np.array(arr1) 
arr3 = np.asarray(arr1) 

# 修改原始数组
arr1[1] = 2 

print('arr1:\n', arr1) 
print('arr2:\n', arr2) 
print('arr3:\n', arr3)

运行结果如下:

arr1: 
[[ 1. 1. 1.] 
 [ 2. 2. 2.] 
 [ 1. 1. 1.]] 
arr2: 
[[ 1. 1. 1.] 
 [ 1. 1. 1.] 
 [ 1. 1. 1.]] 
arr3: 
[[ 1. 1. 1.] 
 [ 2. 2. 2.] 
 [ 1. 1. 1.]]

分析结果:

  • arr2 由 np.array(arr1) 生成,它是 arr1 的副本。因此,修改 arr1 的第二行后,arr2 保持初始的全 1 状态,未受 arr1 变化的影响。
  • arr3 由 np.asarray(arr1) 生成,它直接引用 arr1。因此,arr3 反映了 arr1 修改后的状态(第二行变为 2)。

总结与使用建议

选择 array 还是 asarray,主要取决于你对内存和数据共享的需求:

  • 使用 np.array:当你需要确保数据独立性,防止后续修改影响原始数据,或者需要强制转换数据类型/顺序时,应使用 array。它更安全,但会消耗更多内存。
  • 使用 np.asarray:当你处理大型数组且希望避免不必要的内存拷贝以提升性能时,应使用 asarray。但需注意,修改原数组会同步影响转换后的数组。

以上就是对 numpy 中 array 和 asarray 的区别详解,更多关于 Python 数据处理优化的资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表