次の厄介な動作は意図的なものですか、それともバグですか?
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バージョン:2.7.2、Numpyバージョン:1.6.1
それは意図的なものです。
+=演算子は配列の型を保持します。言い換えると、整数の配列は整数の配列のままです。
これにより、NumPyは+=既存のアレイストレージを使用して操作を実行できます。一方、a=a+b合計の新しい配列を作成し、aこの新しい配列を指すように再バインドします。これにより、操作に使用されるストレージの量が増加します。
ドキュメントを引用するには:
警告:インプレース演算は、2つのオペランドのデータ型によって決定された精度を使用して計算を実行しますが、結果を(必要に応じて)サイレントにダウンキャストして、配列に戻すことができるようにします。したがって、混合精度の計算で
A {op}= Bは、はとは異なる場合がありA = A {op} Bます。たとえば、a = ones((3,3))。次に、 :a += 3jとは異なりa = a + 3jます。どちらも同じ計算を実行しますa += 3が、結果をキャストして元に戻しますがa、a = a + 3j名前を結果に再バインドしaます。
a最後に、そもそもなぜ整数配列だったのか疑問に思っている場合は、次のことを考慮してください。
In [3]: np.arange(5).dtype
Out[3]: dtype('int64')
In [4]: np.arange(5.0).dtype
Out[4]: dtype('float64')
@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が配列のデータ型を変更することは実用的ではなく、望ましくありません。