numpy.array 与 numpy.asarray 区别
numpy.array
和 numpy.asarray
都可以将输入数据转换为 ndarray
,但两者的主要区别在于:
内存行为:
- 当数据源是一个
ndarray
时:np.array
会复制数据,创建一个新的副本,占用额外内存。np.asarray
不会复制数据,而是直接使用原数据的内存。
应用场景:
- 使用
np.array
时,不论数据源为何,总是返回一个独立的副本。 - 使用
np.asarray
时,如果数据源已经是ndarray
,它只是返回一个引用,不会进行复制。
示例 1:原始数据为普通 Python 嵌套列表
import numpy as np # 原始数据为嵌套列表 data1 = [[1, 1, 1], [1, 1, 1], [1, 1, 1]] # 使用 np.array 和 np.asarray 转换 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
都是转换时的独立副本,因此修改data1
不会影响它们。 - 在这种情况下,
np.array
和np.asarray
的行为没有差别。
示例 2:原始数据为 NumPy 数组
import numpy as np # 原始数据为 ndarray arr1 = np.ones((3, 3)) # 使用 np.array 和 np.asarray 转换 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.]]
说明:
arr1
被修改。arr2
是arr1
的副本,因此修改arr1
不会影响arr2
。arr3
是对arr1
的引用,因此修改arr1
直接反映在arr3
中。
结论
相同点:
- 当数据源不是
ndarray
(如列表、元组等)时,np.array
和np.asarray
的行为一致,都会生成一个新的ndarray
。
不同点:
- 当数据源是
ndarray
时:np.array
复制数据,生成新的ndarray
。np.asarray
直接返回引用,不复制数据。
使用建议:
- 如果需要确保数据的独立性(如不希望原数据被修改影响到结果),使用
np.array
。 - 如果可以接受数据共享(如为了节省内存),使用
np.asarray
。