12

私がこれを持っているとしましょう:

def incrementElements(x):
   return x+1

しかし、numpy 配列、イテラブル、またはスカラーのいずれかを取り、引数を numpy 配列に昇格させ、各要素に 1 を追加できるように変更したいと考えています。

どうすればそれができますか?引数クラスをテストできると思いますが、それは悪い考えのようです。私がこれを行う場合:

def incrementElements(x):
   return numpy.array(x)+1

配列またはイテラブルでは適切に機能しますが、スカラーでは機能しません。ここでの問題はnumpy.array(x)、スカラー x の場合、numpy 配列に含まれるが「実際の」配列ではない奇妙なオブジェクトが生成されることです。それにスカラーを追加すると、結果はスカラーに降格されます。

4

4 に答える 4

9

あなたは試すことができます

def incrementElements(x):
    x = np.asarray(x)
    return x+1

np.asarray(x)はと同等ですnp.array(x, copy=False)。つまり、スカラーまたはイテラブルはに変換されますndarrayが、xがすでにの場合ndarray、そのデータはコピーされません。

スカラーを渡し、ndarray出力として(スカラーではなく)必要な場合は、次を使用できます。

def incrementElements(x):
    x = np.array(x, copy=False, ndmin=1)
    return x

引数はndmin=1、配列に少なくとも1つの次元を持たせるようにします。ndmin=2少なくとも2次元などに使用します。同等のものを使用することもできますnp.atleast_1d(またはnp.atleast_2d2Dバージョンの場合...)

于 2012-09-29T13:38:00.060 に答える
0

これは古い質問ですが、これが私の 2 セントです。

Pierre GM の回答はうまく機能しますが、スカラーを配列に変換するという望ましくない副作用があります。それがあなたが望む/必要なものである場合は、読むのをやめてください。それ以外の場合は続行します。これは問題ないかもしれませんが (おそらくlistsand otheriterablesが を返すのに適してnp.arrayいます)、スカラーの場合はスカラーを返す必要があると主張することもできます。それが望ましい動作である場合は、Python のEAFP哲学に従ってください。np.asarrayこれは私が通常行うことです ( 「スカラー」を返すときに何が起こるかを示すために例を変更しました):

def saturateElements(x):
    x = np.asarray(x)
    try:
        x[x>1] = 1
    except TypeError:
        x = min(x,1)
    return x

Pierre GMの回答よりも冗長であることは承知していますが、私が言ったように、このソリューションは、スカラーが渡された場合、またはnp.array配列またはイテラブルが渡された場合にスカラーを返します。

于 2015-10-03T00:37:52.543 に答える