次の厄介な動作は意図的なものですか、それともバグですか?
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が配列のデータ型を変更することは実用的ではなく、望ましくありません。