2

関数を作成しようとしていますが、入力が要素の場合は 1 つの要素を返し、入力が配列の場合は出力の配列を返し、出力配列の各要素が入力配列の同じ場所に関連付けられるようにします。私はダミーの例を挙げています:

import numpy as np
def f(a):
    if a<5:
        print a;
f(np.arange(11))

このコードはエラーを返します: a<5 の場合:

ValueError: 複数の要素を持つ配列の真の値があいまいです。a.any() または a.all() を使用する

出力は次のようになると思います。

0
1
2
3
4

多くのpython関数がこのように機能していると思うので、説明した方法で機能させるにはどうすればよいですか?

ありがとう。

4

4 に答える 4

1

この種のことに対処しなければならないとき、私は通常np.asarray、最初に入力を実行し、0 次元 (つまりスカラー) の場合はフラグを設定し、それを 1 次元に昇格させ、関数を実行することから始めます。フラグが設定されている場合は、返す前にそれをスカラーに変換し直します。あなたの例で:

def f(a):
    a = np.asarray(a)
    is_scalar = False if a.ndim > 0 else True
    a.shape = (1,)*(1-a.ndim) + a.shape
    less_than_5 = a[a < 5]
    return (less_than_5 if not is_scalar else
            (less_than_5[0] if less_than_5 else None))

>>> f(4)
4
>>> f(5)
>>> f([3,4,5,6])
array([3, 4])
>>> f([5,6,7])
array([], dtype=int32)

これを頻繁に行う場合は、すべての処理を関数デコレータに追加できます。

于 2013-03-31T19:33:29.593 に答える
1
import numpy as np
def f(a):
    result = a[a<5]
    return result

def report(arr):
    for elt in arr:
        print(elt)

report(f(np.arange(11)))

一般的に言えば、私は print 文を関数に入れるのは好きではありません (関数が print 以外何もしない場合を除きます)。I/O を計算から分離しておくと、関数はより再利用しやすくなります。


また、入力によってはスカラー、その他の入力では配列など、さまざまなタイプの出力を返す関数を作成することも、一般的にはお勧めできません。これを行うと、この関数を使用する後続のコードはすべて、出力がスカラーか配列かをチェックする必要があります。または、関数に送信される入力の種類を制御するために、コードを非常に慎重に記述する必要があります。これを行うと、コードが非常に複雑になったり、非常にバグが発生したりする可能性があります。

単純な関数 (常に配列を返すか、常にスカラーを返す関数) を記述します。

于 2013-03-31T14:30:11.367 に答える
0

を使用isinstanceして引数の型をチェックし、関数に正しいアクションを実行させることができます。

In [15]: a = np.arange(11)

In [16]: isinstance(a, np.ndarray)
Out[16]: True

In [17]: b = 12.7

In [18]: isinstance(b, float)
Out[18]: True

In [19]: c = 3

In [20]: isinstance(c, int)
Out[20]: True

In [21]: d = '43.1'

In [23]: isinstance(d, str)
Out[23]: True

In [24]: float(d)
Out[24]: 43.1

In [25]: float('a3')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-25-caad719e0e75> in <module>()
----> 1 float('a3')

ValueError: could not convert string to float: a3

strこのようにして、 a 、 a float、 an int、 alistまたは anが与えられても正しいことを行う関数を作成できますnumpy.ndarray

于 2013-03-31T14:30:42.493 に答える