2012-05-24 3 views
24

다음 numpy 동작이 의도적입니까, 아니면 버그입니까?Numpy가 a + b와 a = a + b를 다르게 취급하는 이유

from numpy import * 

a = arange(5) 
a = a+2.3 
print 'a = ', a 
# Output: a = 2.3, 3.3, 4.3, 5.3, 6.3 

a = arange(5) 
a += 2.3 
print 'a = ', a 
# Output: a = 2, 3, 4, 5, 6 

파이썬 버전 : 2.7.2, NumPy와 버전 : 의도적이다 1.6.1

답변

41

.

+= 연산자는 배열 유형을 유지합니다. 즉, 정수 배열은 정수 배열로 유지됩니다.

이렇게하면 NumPy가 기존 배열 스토리지를 사용하여 += 작업을 수행 할 수 있습니다. 반면에 a=a+b은 합계에 대해 새로운 배열을 만들고 a을 리 바인드하여이 새 배열을 가리 킵니다. 이것은 조작에 사용되는 기 o 장치의 양을 늘립니다. (필요한 경우) 때문에, 두 개의 피연산자의 데이터 타입에 의해 결정 정밀도를 사용하여 계산을 수행 할 장소 운영에서을하지만 자동 결과를 다운 캐스트 것이다

경고 :

documentation을 인용 배열에 다시 들어갈 수 있습니다. 따라서 혼합 정밀도 계산의 경우 A {op}= BA = A {op} B과 다를 수 있습니다. 예를 들어 a = ones((3,3))이라고 가정합니다. 그런 다음 a += 3ja = a + 3j과 다릅니다. 둘 다 동일한 계산을 수행하지만 a += 3a에 맞게 결과를 캐스팅합니다. 반면 a = a + 3ja이라는 결과를 다시 바인드합니다. a가 처음에 정수 배열이 왜 당신이 궁금해하는 경우

마지막으로, 다음 사항을 고려하십시오

In [3]: np.arange(5).dtype 
Out[3]: dtype('int64') 

In [4]: np.arange(5.0).dtype 
Out[4]: dtype('float64') 
+0

나는 a가 정수라는 것을 알고 있지만, 파이썬에서 float와 정수를 더하는 것으로 예상되는 결과는 float이므로 예상치 못한 "feature"입니다. – Dhara

+4

@Dhara : 나는 처음 만났을 때 예상치 못한 결과를내는 것에 동의합니다. . 또한 유용 할 수 있습니다. 여하튼, 설명서에서 동작을 설명하는 견적을 추가했습니다. – NPE

+0

인플레 이스 (In-place) 연산은 훨씬 빠르며 (할당이 없으며, 캐시 활용도가 더 높음), 털이 많은 데이터 구조가있는 경우이 배열에 대한 모든 기존 참조를 유지할 수 있습니다. 또한 이들은 C/C++/Fortran 배경의 프로그래머에게 매우 유용합니다. –

8

@aix 완전히 권리입니다. 나는 이것이 numpy에만 국한된 것이 아니라는 점을 지적하고자했습니다. 예를 들어 :

>>> a = [] 
>>> b = a 
>>> a += [1] 
>>> print a 
[1] 
>>> print b 
[1] 
>>> a = a + [2] 
>>> print a 
[1, 2] 
>>> print b 
[1] 

당신이 +=을 볼 수있는 목록을 수정하고 + 새로운 목록을 만듭니다. 이것은 numpy를 위해서도 유효합니다. +은 모든 데이터 유형이 될 수 있도록 새 배열을 만듭니다. +=은 배열을 변경하지 않고 배열 내용을 수정할 때 numpy가 배열의 데이터 유형을 변경하는 것은 바람직하지 않습니다.

+0

좋은 지적, 고마워. – Dhara

관련 문제