これが既知の問題である場合は申し訳ありませんが、検索しましたが、結果が非常に多くなっています...
これは機能します:
import numpy as np
a = np.array([1, 2, 3])
a = a / 4
しかし、これはエラーを引き起こします:
import numpy as np
a = np.array([1, 2, 3])
a /= 4
すなわち:
TypeError: No loop matching the specified signature and casting
was found for ufunc true_divide
私は彼らが同じことをすることを期待するので、これは驚くべきことです。
numpyバージョン1.14.0を使用します。
Python 3を使用していると仮定します。これは、Python 3で予想される動作です。 a / 4
の結果は、整数配列ではなく浮動小数点配列になります。 その結果をa = a / 4
行で再割り当てするだけで、問題ありません。 基本的に、コードをa = np.true_divide(a, 4)
変換します。これにより、新しい浮動小数点配列が作成され、名前a
が再割り当てされます。
インプレース割り当てを実行しようとすると、 true_divide
ufuncは、既存のa
整数配列np.true_divide(a, 4, out=a)
に出力するように求められます。 2つの整数引数を取り、別の整数を出力するtrue_divide
の実装はないため、例外が発生します。
明確な説明をありがとう、それは理にかなっています。 以下は私が違いを理解するのに役立ちました:
>>> a = [1 ,2, 3]
>>> b = a
>>> id(a) == id(b)
True
>>> a += [4, 5, 6] # list object is changed, no new object created
>>> id(a) == id(b)
True
>>> a = a + [4, 5, 6] # new object created, and assigned to `a`
>>> id(a) == id(b)
False
私が正しく理解していれば、 +=
で新しいオブジェクトが作成されないという事実は、 out=a
類似しています。
この問題を回避する1つの方法は、アレイの作成時にdtype=float
を使用することです。
それは正しい。
最も参考になるコメント
Python 3を使用していると仮定します。これは、Python 3で予想される動作です。
a / 4
の結果は、整数配列ではなく浮動小数点配列になります。 その結果をa = a / 4
行で再割り当てするだけで、問題ありません。 基本的に、コードをa = np.true_divide(a, 4)
変換します。これにより、新しい浮動小数点配列が作成され、名前a
が再割り当てされます。インプレース割り当てを実行しようとすると、
true_divide
ufuncは、既存のa
整数配列np.true_divide(a, 4, out=a)
に出力するように求められます。 2つの整数引数を取り、別の整数を出力するtrue_divide
の実装はないため、例外が発生します。