2012-05-24 35 views
24

Aşağıdaki sayısal davranışlar kasıtlı mıdır, yoksa bir hata mıdır?Neden Numpy a + = b ve a = a + b farklı davranır

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 

Python sürümü: 2.7.2, Numpy sürümü: kasıtlı var 1.6.1

cevap

41

.

+= işleci, dizinin türünü korur. Başka bir deyişle, bir tam sayı dizisi bir dizi tamsayı olarak kalır.

Bu, NumPy'nin varolan dizi depolamasını kullanarak += işlemini gerçekleştirmesini sağlar. Öte yandan, a=a+b toplamı için yepyeni bir dizi oluşturur ve bu yeni diziye işaret etmek için a'u yeniden ispatlar; Bu, işlem için kullanılan depolama miktarını artırır. (Gerekirse) böylece iki işlenenlerin veri türüne karar kesinlik kullanarak hesaplama yapacak yer operasyonlarda ama sessizce sonucu downcast olacaktır:

Uyarı:

documentation alıntı diziye geri sığabilir. Bu nedenle, karışık hassas hesaplamalar için A {op}= B, A = A {op} B'dan farklı olabilir. Örneğin, a = ones((3,3)) varsayalım. Sonra a += 3j, a = a + 3j'dan farklıdır: her ikisi de aynı hesaplama gerçekleştirirken, a += 3 sonucu a'a sığdırmak için sonuç verir, a = a + 3j ise sonuca a adını yeniden bağlar. a ilk etapta bir tamsayı dizisi neden Merak ediyorsan

Son olarak, aşağıdakileri dikkate alın:

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

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

A'nın bir tamsayı olduğunu anlıyorum, ancak Python'da bir kayan nokta ekleme ve tamsayıların bir kayan olması beklenen sonuçtur, bu yüzden beklenmedik bir "özellik" – Dhara

+4

@ Dhara: İlk karşılaşıldığında bunun beklenmedik olabileceğini kabul ediyorum . Ayrıca yararlı olabilir. Her halükarda, davranışları açıklayan belgelerden bir alıntı ekledim. – NPE

+0

Yerinde işlemler çok daha hızlı olabilir (hiçbir tahsisat, daha iyi önbellek kullanımı) ve mevcut dizinin tümünü bu dizide tutabilirsiniz (kıllı veri yapılarınız varsa). Ayrıca bunlar C/C++/Fortran arka plan programcıları için çok kullanışlıdır. –

8

@aix tamamen doğru. Sadece bunun, uyuşmaya özgü olmadığını belirtmek istedim. Örneğin:

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

sen += görebileceğiniz gibi listeyi değiştirir ve + yeni bir liste oluşturur. Bu, aynı zamanda uyuşmuş için de geçerlidir. +, yeni bir dizi oluşturur, böylece herhangi bir veri türü olabilir. +=, diziyi yerinde değiştirir ve pratik değildir ve dizi içeriği değiştirildiğinde bir dizinin veri türünü değiştirmek için numpy için imo istenebilir.

+0

İyi nokta, teşekkürler – Dhara

İlgili konular