24

次の厄介な動作は意図的なものですか、それともバグですか?

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

4

2 に答える 2

41

それは意図的なものです。

+=演算子は配列の型を保持します。言い換えると、整数の配列は整数の配列のままです。

これにより、NumPyは+=既存のアレイストレージを使用して操作を実行できます。一方、a=a+b合計の新しい配列を作成し、aこの新しい配列を指すように再バインドします。これにより、操作に使用されるストレージの量が増加します。

ドキュメントを引用するには:

警告:インプレース演算は、2つのオペランドのデータ型によって決定された精度を使用して計算を実行しますが、結果を(必要に応じて)サイレントにダウンキャストして、配列に戻すことができるようにします。したがって、混合精度の計算でA {op}= Bは、はとは異なる場合がありA = A {op} Bます。たとえば、a = ones((3,3))。次に、 :a += 3jとは異なりa = a + 3jます。どちらも同じ計算を実行しますa += 3が、結果をキャストして元に戻しますがaa = 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')
于 2012-05-24T14:55:50.463 に答える
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が配列のデータ型を変更することは実用的ではなく、望ましくありません。

于 2012-05-24T16:53:37.773 に答える