Numpy: 除算-代入演算子はエラーを発生させ、除算と代入の作業を分離します

作成日 2018年02月09日  ·  3コメント  ·  ソース: numpy/numpy

これが既知の問題である場合は申し訳ありませんが、検索しましたが、結果が非​​常に多くなっています...

これは機能します:

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の実装はないため、例外が発生します。

全てのコメント3件

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を使用することです。

それは正しい。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

Kreol64 picture Kreol64  ·  3コメント

toddrjen picture toddrjen  ·  4コメント

'
Pezhvuk picture Pezhvuk  ·  4コメント

inducer picture inducer  ·  3コメント

keithbriggs picture keithbriggs  ·  3コメント