24

リストからアウトライナーを置き換えたい。したがって、上限と下限を定義します。upper_boundこれで、上下のすべての値lower_boundがバインドされた値に置き換えられます。私のアプローチは、numpy 配列を使用して 2 つのステップでこれを行うことでした。

パフォーマンスと可読性を向上させることができると思うので、これを 1 つのステップで実行できるかどうか疑問に思います。

これを行うためのより短い方法はありますか?

import numpy as np

lowerBound, upperBound = 3, 7

arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

arr[arr > upperBound] = upperBound
arr[arr < lowerBound] = lowerBound

# [3 3 3 3 4 5 6 7 7 7]
print(arr)
4

2 に答える 2

36

使用できますnumpy.clip

In [1]: import numpy as np

In [2]: arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [3]: lowerBound, upperBound = 3, 7

In [4]: np.clip(arr, lowerBound, upperBound, out=arr)
Out[4]: array([3, 3, 3, 3, 4, 5, 6, 7, 7, 7])

In [5]: arr
Out[5]: array([3, 3, 3, 3, 4, 5, 6, 7, 7, 7])
于 2016-12-26T10:20:30.010 に答える
14

に依存しない代替案については、numpyいつでも行うことができます

arr = [max(lower_bound, min(x, upper_bound)) for x in arr]

上限を設定したいだけなら、もちろん と書くことができますarr = [min(x, upper_bound) for x in arr]。または同様に、下限だけが必要な場合は、max代わりに使用します。

ここでは、両方の操作をまとめて適用しました。

編集:これはもう少し詳細な説明です:

配列の要素を指定すると (そして、 yourが少なくとも your ! と同じ大きさでxあると仮定すると)、次の 3 つのケースのいずれかになります。upper_boundlower_bound

  1. x < lower_bound
  2. x > upper_bound
  3. lower_bound <= x <= upper_bound.

ケース 1 では、max/min式は最初に に評価されmax(lower_bound, x)、次に に解決されlower_boundます。

ケース 2 では、式は最初に になりmax(lower_bound, upper_bound)、次に になりupper_boundます。

ケース 3 では、max(lower_bound, x)だけに解決されるを取得しxます。

3 つのケースすべてで、必要な出力が得られます。

于 2016-12-26T15:24:56.267 に答える