1

これはどこかに文書化されていますか?なぜそんなに劇的な違いがあるのでしょうか?

# Python 3.2
# numpy 1.6.2 using Intel's Math Kernel Library
>>> import numpy as np
>>> x = np.float64(-0.2)
>>> x ** 0.8
__main__:1: RuntimeWarning: invalid value encountered in double_scalars
nan
>>> x = -0.2 # note: `np.float` is same built-in `float`
>>> x ** 0.8
(-0.2232449487530631+0.16219694943147778j)

これによるとnp.float64、ビルトインは。floatを除いて同一であるため、これは特に混乱を招き__repr__ます。

npからの警告が場合によってはどのように役立つかがわかります(特に、で無効または有効にできるためnp.seterr)。ただし、問題は、戻り値がnan組み込みによって提供される複素数値ではないことです。したがって、これは、一部の計算に使用を開始するときにコードを壊し、numpyその戻り値を組み込みのfloatに明示的に変換しません。

4

2 に答える 2

3

numpy.floatかもしれないし、そうでないかもしれませんがfloat、複素数はまったくありませんfloat:

In [1]: type((-0.2)**0.8)
Out[1]: builtins.complex

floatしたがって、操作の結果はありませんnan

への明示的な変換を行いたくない場合float(推奨)、numpy複素数で計算を行います。

In [3]: np.complex(-0.2)**0.8
Out[3]: (-0.2232449487530631+0.16219694943147778j)
于 2012-12-29T22:29:56.527 に答える
1

浮動小数点演算から複素数を返す動作は確かに通常ではなく、Python 3 でのみ導入されました (/演算子による整数の浮動小数点除算のように)。Python 2.7 では、次のようになります。

In [1]: (-0.2)**0.8
ValueError: negative number cannot be raised to a fractional power

スカラーでは、代わりにnp.float64を使用すると、 Python が使用np.floatするのと同じ型が得られます。float(そして、2.7 で上記のエラーが発生するか、3.x で複素数が発生します。)

配列の場合、すべての numpy 演算子は同じ型の配列を返し、ほとんどの ufunc は float > complex からのキャストをサポートしていません (例: check np.<ufunc>.type)。

  • スカラーに対する一貫した操作が必要な場合は、次を使用しますnp.float
  • 配列操作に興味がある場合は、配列を複雑にキャストする必要があります。x = x.astype('complex')
于 2012-12-30T00:00:43.613 に答える