8

長年の読者、初めての作家。

Google とスタック オーバーフローを検索しましたが、この質問に対する一般的な回答を実際に見つけることができませんでした。

numpy 1.6.2 を使用する Python 2.7.3 で、「*: 'numpy.ndarray' および 'numpy.float64' のサポートされていないオペランド タイプ」エラーが発生します。

このエラーは、numpy 配列と numpy float を乗算することによって発生しますが、毎回発生するわけではありません。

例えば:

x = np.tan(1) # numpy.float64
y = np.array([0,1,2,3]) # numpy.ndarray
np.multiply(x,y) # works no problem

または

x = np.tan(np.abs(np.multiply(-31,41)))  # numpy.float64
y = np.square(np.add(np.divide(np.zeros(100),42),(-27)**40)) # numpy.ndarray
np.multiply(x,y) # works no problem

どちらも動作します

問題のある子供たちのために:

np.multiply(np.square(np.add(np.divide(np.zeros(100),42),-27)**40)),
np.tan(np.abs(np.multiply(-31,41))))

または、上記のように x を定義すると、次のようになります。

np.multiply(np.square(np.add(np.divide(np.zeros(100),42),(-27)**40)),x)

どちらもエラーを生成します: NotImplemented

ランダムな関数と数値が奇妙に見えることは知っていますが、概念的には、両方が変数に個別に設定されたときに機能したため、これは機能するはずです。

なぜこれが起こるのですか?一般的な意味でどのように修正できますか?

本当にありがとう!ジェイソン

4

2 に答える 2

7

ここでの問題は、NumPy が Pythonlongの値を配列に格納できないことだと思います。これを実行しようとするとすぐに、配列のデータ型が に切り替わりますobject。NumPy は算術自体を実行できなくなるため、配列の算術演算はより複雑になります。

>>> np.array(27**40)
array(1797010299914431210413179829509605039731475627537851106401L, dtype=object)
>>> np.array(27**40) * np.tan(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'numpy.ndarray' and 'numpy.float64'

奇妙なことに、引数の順序を入れ替えるとうまくいくことがあります。

>>> np.tan(1) * np.array(27**40)
2.7986777223711575e+57

この 2 番目のケースでは、結果の型は Pythonfloatであり、NumPy 配列ではありません。

修正はlong、NumPy 配列で値を作成することを避け、float代わりに s を使用することです。

>>> np.array(27.0**40)
array(1.797010299914431e+57)
>>> np.array(27.0**40) * np.tan(1)
2.7986777223711575e+57
>>> np.multiply(np.square(np.add(np.divide(np.zeros(10),42),(-27.0)**40)),np.tan(1))
array([  5.02925269e+114,   5.02925269e+114,   5.02925269e+114,
         5.02925269e+114,   5.02925269e+114,   5.02925269e+114,
         5.02925269e+114,   5.02925269e+114,   5.02925269e+114,
         5.02925269e+114])

this is the future のようなエラーが発生した場合、最初にすべきことは、dtype乗算される配列の を確認することです。NumPy 値または Python オブジェクトが含まれていますか?

于 2013-01-18T22:32:16.410 に答える
1

これはクイズですか?なぜ質問が難読化されているのかわかりません... すべてはこの単純な事実に帰結します。

与えられた

>>> x = 10**100
>>> type(x)
<type 'long'>
>>> y = np.float64(1)

我々は持っています

>>> y.__mul__(x)
1e+100
>>> y.__rmul__(x)
NotImplemented

これがバグです(または機能、わかりません)それはそうあるべきだからですy.__mul__(x) == y.__rmul__(x)(少なくとも と のこれらの特定の値についてxy

Pythonlongは で乗算を処理する方法を知りませんnumpy.float64(しかし、これは正しいです。)

>>> x.__mul__(y)
NotImplemented
>>> x.__rmul__(y)
NotImplemented

したがってy*x、評価されy.__mul__(x)、期待される結果が得られます。それどころか、(実装されていないがバグである) よりも (実装されていない、OK)x*yとして最初に試行されます。x.__mul__(y)y.__rmul__(x)

すでに指摘したようにnd.arrays、任意のオブジェクトを持つことができ、すべてが明らかになります。

編集

このバグは修正されました (おそらく numpy バ​​ージョン 1.7 で):

>>> np.version.version
'1.13.1'
>>> x = 10**100
>>> y = np.float64(1)
>>> x.__mul__(y)
NotImplemented
>>> x.__rmul__(y)
NotImplemented
>>> y.__mul__(x)
1e+100
>>> y.__rmul__(x)
1e+100
>>> x*y
1e+100
>>> y*x
1e+100
于 2013-01-18T22:59:36.217 に答える