111

numpy.array 与 numpy.asarray 区别

numpy.arraynumpy.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 被修改,但 arr2arr3 都是转换时的独立副本,因此修改 data1 不会影响它们。
  • 在这种情况下,np.arraynp.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 被修改。
  • arr2arr1 的副本,因此修改 arr1 不会影响 arr2
  • arr3 是对 arr1 的引用,因此修改 arr1 直接反映在 arr3 中。

结论

相同点

  • 当数据源不是 ndarray(如列表、元组等)时,np.arraynp.asarray 的行为一致,都会生成一个新的 ndarray

不同点

  • 当数据源是 ndarray 时:
    • np.array 复制数据,生成新的 ndarray
    • np.asarray 直接返回引用,不复制数据。

使用建议

  • 如果需要确保数据的独立性(如不希望原数据被修改影响到结果),使用 np.array
  • 如果可以接受数据共享(如为了节省内存),使用 np.asarray