NumPy中array_2=array_1与array_2=array_1.view()的区别是什么
NumPy两种赋值方式的区别
核心是两种赋值的底层逻辑完全不同:
- 直接赋值
array_2 = array_1:属于对象引用绑定,两个变量指向完全相同的数组对象,共享所有属性和数据存储空间。 - 视图赋值
array_2 = array_1.view():会创建全新的数组对象,但新数组和原数组共享底层的数据缓冲区,数组自身的属性(维度、数据类型等)独立。
实操示例
场景1:直接赋值的效果
import numpy as np # 初始化原数组 array_1 = np.array([1,2,3,4,5]) # 直接赋值 array_2 = array_1 print(f"修改前array_1: {array_1}") print(f"修改前array_2: {array_2}") print(f"是否为同一个对象: {array_2 is array_1}") print(f"是否共享内存数据: {np.shares_memory(array_1, array_2)}") # 修改array_2的元素值 array_2[0] = 100 print(f"\n修改array_2元素后array_1: {array_1}") print(f"修改array_2元素后array_2: {array_2}") # 修改array_2的维度 array_2.shape = (5,1) print(f"\n修改array_2维度后array_1的shape: {array_1.shape}") print(f"修改array_2维度后array_2的shape: {array_2.shape}")
运行输出结果:
- 修改前array_1:
[1 2 3 4 5] - 修改前array_2:
[1 2 3 4 5] - 是否为同一个对象:
True - 是否共享内存数据:
True - 修改array_2元素后array_1:
[100 2 3 4 5] - 修改array_2元素后array_2:
[100 2 3 4 5] - 修改array_2维度后array_1的shape:
(5, 1) - 修改array_2维度后array_2的shape:
(5, 1)
可见直接赋值场景下,修改array_2的任意内容和属性都会同步影响原数组array_1。
场景2:view()创建视图的效果
import numpy as np # 初始化原数组 array_1 = np.array([1,2,3,4,5]) # 创建视图 array_2 = array_1.view() print(f"修改前array_1: {array_1}") print(f"修改前array_2: {array_2}") print(f"是否为同一个对象: {array_2 is array_1}") print(f"是否共享内存数据: {np.shares_memory(array_1, array_2)}") # 修改array_2的元素值 array_2[0] = 100 print(f"\n修改array_2元素后array_1: {array_1}") print(f"修改array_2元素后array_2: {array_2}") # 修改array_2的维度 array_2.shape = (5,1) print(f"\n修改array_2维度后array_1的shape: {array_1.shape}") print(f"修改array_2维度后array_2的shape: {array_2.shape}")
运行输出结果:
- 修改前array_1:
[1 2 3 4 5] - 修改前array_2:
[1 2 3 4 5] - 是否为同一个对象:
False - 是否共享内存数据:
True - 修改array_2元素后array_1:
[100 2 3 4 5] - 修改array_2元素后array_2:
[100 2 3 4 5] - 修改array_2维度后array_1的shape:
(5,) - 修改array_2维度后array_2的shape:
(5, 1)
可见视图赋值场景下,修改array_2的元素值会同步影响原数组,但修改array_2自身的属性不会对原数组产生任何影响。
核心区别汇总
| 赋值方式 | 是否为同一数组对象 | 共享底层数据 | 修改元素影响原数组 | 修改数组属性影响原数组 |
|---|---|---|---|---|
array_2 = array_1 | 是 | 是 | 是 | 是 |
array_2 = array_1.view() | 否 | 是 | 是 | 否 |
内容的提问来源于stack exchange,提问作者user17495296
相关产品推荐
相关产品推荐

