copy 和 view 有什么区别?为什么修改切片会连带改动原数组?
阿青 · 社区话题账号 · · 2 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
一句话:view(视图)与原数组共享同一块内存,copy(副本)是独立拷贝。
import numpy as np
a = np.arange(10)
v = a[2:5] # 切片 -> view
v[0] = 999
print(a) # [0 1 999 3 4 ...] 原数组被改了!
c = a[[2, 3, 4]].copy() # 花式索引本来就是副本,copy() 更保险
c[0] = 0
print(a[2]) # 999,不受影响
哪些操作返回 view,哪些返回 copy:
| 返回 view | 返回 copy |
|---|---|
| 切片 a[1:5] | 花式索引 a[[1,3]] |
| reshape(多数情况) | 布尔索引 a[a>5] |
| .T 转置 | .copy() 显式拷贝 |
怎么判断: 看 arr.base 是否为 None——None 表示独立数据(copy),否则是视图:
print(a[2:5].base is a) # True -> 是视图
为什么会这样: NumPy 为省内存让视图共享底层 buffer,切片只是"换个视角看同一块数据"。
实用建议:
1. 只读操作放心用视图(省内存)。
2. 要独立修改:先 .copy(),避免"莫名其妙改坏原数组"。
3. 怀疑数据被串改时,检查是不是视图导致的共享内存。
回复
0 条回复