python - numpy 的deep copy 问题
PHPz
PHPz 2017-04-18 10:17:56
0
1
643

在列表中,b=a[:]b=a.copy()是具有相同效果的,都可以用来deep copy,但是在numpy 数组中两者效果却不同,b=a[:]复制后b仍然随着a的改变而改变,但是两者指向的内存地址却不同,b is a也返回false,这是为什么呢?谢谢!

>>>import numpy as np
>>>a=np.arange(4)
>>>b=a
>>>c=a[:]
>>>d=a.copy()
>>>a[3]=10
>>>id(a)
140572616448320
>>>id(b)
140572616448320         # a,b的指针地址相同
>>>id(c)
140572616446080
>>>id(d)
140572616448640 
>>>a
array([ 0,  1,  2, 10])
>>>b
array([ 0,  1,  2, 10])
>>>c
array([ 0,  1,  2, 10]) # a,c的指针地址不同,变化却是一致的
>>>d
array([0, 1, 2, 3])
PHPz
PHPz

学习是最好的投资!

répondre à tous(1)
洪涛

numpyIl existe trois situations concernant copy, aucune copie du tout , vue (view) ou copie superficielle (shadow copy) et Copie profonde (deep copy).

et b = a[:] appartiennent au deuxième type, c'est-à-dire la vue, qui est essentiellement une opération de découpage (slicing), et toutes les opérations de découpage renvoient des vues. Plus précisément, b = a[:] créera un nouvel objet b (donc l'identifiant est différent de a), mais les données de b proviennent entièrement de a et restent complètement cohérentes avec a Change In other. En d'autres termes, les données de b sont entièrement conservées par a, et les modifications de données des deux sont cohérentes. Vous pouvez voir l'exemple suivant :

.
a = np.arange(4)  # array([0, 1, 2, 3])
b = a[:]  # array([0, 1, 2, 3])

b.flags.owndata  # 返回 False,b 并不保管数据
a.flags.owndata  # 返回 True,数据由 a 保管

# 改变 a 同时也影响到 b
a[-1] = 10  # array([0, 1, 2, 10])
b  #  array([0, 1, 2, 10])

# 改变 b 同时也影响到 a
b[0] = 10  # array([10, 1, 2, 10])
a  # array([10, 1, 2, 10])
La différence entre

b = a et b = a[:] est que ce dernier créera un nouvel objet, mais pas le premier. Les deux méthodes feront interagir les données de a et b les unes avec les autres.

Pour éviter que les modifications de a n'affectent b, vous pouvez utiliser la copie complète :

unique_b = a.copy()
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal