14

私は次の関数をベクトル化しようとしました(同意しました、それを行うための最も効率的な方法ではありませんが、私の質問はデコレータの使用にあります)

 @np.vectorize
 def diff_if_bigger(x, y):
     return y - x if y > x else 0

 x = np.array([5.6, 7.0])
 y = 8

 diff_if_bigger(x, y)
 # outputs array([2, 1]) which is not what I want

編集:IPythonを再起動した後、出力はOKでした。

最初の引数xがここにあるとしても、ドキュメントの内容とは逆に、結果がdiff_if_bigger配列に変換された理由を誰かが説明できますか????np.intnp.float

今、私はフロート出力を強制したいので、これを行いました

 @np.vectorize('np.float')
 def diff_if_bigger(x, y):
     return y - x if y > x else 0
 # Error !!
 # TypeError: Object is not callable.

 @np.vectorize(otypes='np.float')
 def diff_if_bigger(x, y):
     return y - x if y > x else 0
 # Again error !!
 # TypeError: __init__() takes at least 2 arguments (2 given)


 @np.vectorize(otypes=[np.float])
 def diff_if_bigger(x, y):
     return y - x if y > x else 0
 # Still an error !!
 # TypeError: __init__() takes at least 2 arguments (2 given)

ちなみにこれでも

 vec_diff = np.vectorize(diff_if_bigger, otypes=[np.float])

動作しません!!! どうしたの??

編集:実際、後者はIPythonを再起動した後に機能しました。

したがって、前の2つの編集の後、私の質問は2つになりました。

1-引数付きのデコレータとしてnp.vectorizeを使用するにはどうすればよいですか?

2-どうすればIPythonの状態をクリーンアップできますか?

4

1 に答える 1

16

私のために働く:

>>> import numpy as np
>>> @np.vectorize
... def diff_if_bigger(x, y):
...      return y - x if y > x else 0
...
>>> diff_if_bigger(np.array([5.6,7.0]), 8)
array([ 2.4,  1. ])

np.vectorize最も単純な場合を除いて、実際にはデコレータとして意図されていないことに注意してください。明示的に指定する必要がある場合otypeは、通常の形式new_func = np.vectorize(old_func, otypes=...)を使用functools.partialするか、デコレータを使用して取得します。

np.vectorizeまた、デフォルトでは、最初の引数で関数を評価して出力型を取得することに注意してください。

の出力のデータ型はvectorized、入力の最初の要素で関数を呼び出すことによって決定されます。

したがって、それが出力 dtype として確実に推論されるようにする場合は、 passfloatと returnを使用する必要があります (例: useと pass )。floatfloatelse 0.0y = 8.0

于 2013-02-20T18:02:59.553 に答える