2017-10-25 4 views
0

1要素numpy配列を要素自体として返す関数を書くためのきれいな方法がありますか?1要素Numpy配列を返すためのきれいな方法

単純な平方関数をベクトル化して、戻り値が入力と同じdtypeになるようにしたいとしましょう。

def foo(x): 
    result = np.square(x) 
    if len(result) == 1: 
     return result[0] 
    return result 

または

def foo(x): 
    if len(x) == 1: 
     return x**2 
    return np.square(x) 

これを行うための簡単な方法があります:私はこのような何かを書くことができますか?私はスカラーと配列の両方のためにこの関数を使うことができますか?

自分の入力のdtypeを直接確認し、IF文を使って動作させることができますが、よりクリーンな方法があります。

+0

これはStackOverflowの質問ですが、ここではヒントがあります:希望の結果がデフォルトNumPyの動作とどのように異なるのかを明確にしてください。_e.g._は 'np.square(2)'と 'np.square([ 2。]) 'と' np.square([1,2,3]) 'と呼ばれます。また、同じ入力について独自のコード例の出力を表示してみてください。 – mjul

+1

これはあなたのために働きますか? '(x ** 2).squeeze()'? – Divakar

答えて

1

私は、あなたがそれを望む非常に良い理由が必要だと思います。 (なぜ必要なのか説明できますか?)

この関数のすべてのクライアントは、結果が配列か単一の要素かどうか、または配列に変換する必要があるかどうかをチェックする必要があります。 配列のすべての要素を繰り返し処理する場合は、要素が1つだけであっても、非常に洗練されたコードが得られます。

これは常に1つの要素でなければならないが(これは変換関数)、returnステートメントは空の/長い配列ではなく例外をスローする必要があります。

それ以外にも、あなたが持っているコードは完全に理解可能/可読です。将来的にあなたや同僚がそれを読まなければならないたびに精神的な負担になります。

- 編集

私はあなたの意見を参照してください。おそらく、既にlen(1)が許されていない(int/floatにlen()がない)という問題に直面しているので、入力引数の型チェックを行うことができます。例えば。

+0

本質的には、私の関数は入力と同じ型を出力したいので、単一の要素を入力すると(フロートと言う)、浮動小数点数の配列を入力すると浮動小数点を戻したい。私の問題は、例えば、私の関数がnp.square(x)のようなものを持っている場合、私のfloatを配列に変換することです。だから私は答えに時間を取ってくれてありがとう、 –

1

質問を完全に理解しているかどうかはわかりませんが、このようなものが役立つでしょうか?

def square(x): 
    if 'numpy' in str(type(x)): 
     return np.square(x) 
    else: 
     if isinstance(x, list): 
      return list(np.square(x)) 
     if isinstance(x, int): 
      return int(np.square(x)) 
     if isinstance(x, float): 
      return float(np.square(x)) 

私はいくつかのテストケースを定義した:

np_array_one = np.array([3.4]) 
np_array_mult = np.array([3.4, 2, 6]) 
int_ = 5 
list_int = [2, 4, 2.9] 
float_ = float(5.3) 
list_float = [float(4.5), float(9.1), float(7.5)] 

examples = [np_array_one, np_array_mult, int_, list_int, float_, list_float] 

だから我々は、関数がどのように動作するかを確認することができます。

for case in examples: 
    print 'Input type: {}.'.format(type(case)) 
    out = square(case) 
    print out 
    print 'Output type: {}'.format(type(out)) 
    print '-----------------' 

そして出力:

Input type: <type 'numpy.ndarray'>. 
[ 11.56] 
Output type: <type 'numpy.ndarray'> 
----------------- 
Input type: <type 'numpy.ndarray'>. 
[ 11.56 4. 36. ] 
Output type: <type 'numpy.ndarray'> 
----------------- 
Input type: <type 'int'>. 
25 
Output type: <type 'int'> 
----------------- 
Input type: <type 'list'>. 
[4.0, 16.0, 8.4100000000000001] 
Output type: <type 'list'> 
----------------- 
Input type: <type 'float'>. 
28.09 
Output type: <type 'float'> 
----------------- 
Input type: <type 'list'>. 
[20.25, 82.809999999999988, 56.25] 
Output type: <type 'list'> 
----------------- 

テストケースから、入力と出力は常に同じです。しかし、この機能は本当にきれいではありません。

私はこのquestionのコードをいくつか使っています。

+0

(float-> float、配列 - >配列)に2つの関数を持たせたいと思う。私はそれを動作させる方法を知っていますが、これを行うためのきれいな方法があるかどうかを知りたいと思っていました。おそらく前に気づいていなかったPythonの魔法のほうが –

+0

です。 – HonzaB

関連する問題