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

在列表中,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

学习是最好的投资!

모든 응답(1)
洪涛

numpycopy, 사본 없음 , 보기(view) 또는 얕은 사본(shadow copy) 및 에 대한 세 가지 상황이 있습니다. 깊은 복사 (deep copy).

b = a[:]는 두 번째 유형인 뷰에 속하며 본질적으로 슬라이싱 작업(slicing)이며 모든 슬라이싱 작업은 뷰를 반환합니다. 구체적으로 b = a[:]는 새 개체 b를 생성하지만(따라서 ID는 a과 다름) b의 데이터는 완전히 a에서 가져오고 a과 완전히 일치합니다. 즉, b의 데이터는 a에 의해 완전히 보관되며, 두 데이터의 변경 사항은 모두 일관됩니다.

으아아아

b = ab = a[:]의 차이점은 후자가 새로운 객체를 생성하지만 전자는 그렇지 않다는 것입니다. 두 방법 모두 ab의 데이터가 서로 상호 작용하도록 합니다.

a의 변경 사항이 b에 영향을 미치지 않도록 하려면 전체 복사를 사용할 수 있습니다.

으아아아
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿