numpy配列の負の値を置き換えます


90

配列内のすべての負の値を0に置き換える簡単な方法はありますか?

NumPy配列を使用してそれを行う方法について完全なブロックがあります。

例えば

a = array([1, 2, 3, -4, 5])

戻る必要があります

[1, 2, 3, 0, 5]

a < 0 与える:

[False, False, False, True, False]

これは私が立ち往生しているところです-この配列を使用して元の配列を変更する方法。

回答:


137

あなたはそこの途中です。試してみてください:

In [4]: a[a < 0] = 0

In [5]: a
Out[5]: array([1, 2, 3, 0, 5])

89

試してみてくださいnumpy.clip

>>> import numpy
>>> a = numpy.arange(-10, 10)
>>> a
array([-10,  -9,  -8,  -7,  -6,  -5,  -4,  -3,  -2,  -1,   0,   1,   2,
         3,   4,   5,   6,   7,   8,   9])
>>> a.clip(0, 10)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

で下半分のみをクリップできますclip(0)

>>> a = numpy.array([1, 2, 3, -4, 5])
>>> a.clip(0)
array([1, 2, 3, 0, 5])

で上半分のみをクリップできますclip(max=n)。(これはNaN、最初のパラメーターに渡してout型を強制するために使用するという以前の提案よりもはるかに優れています。):

>>> a.clip(max=2)
array([ 1,  2,  2, -4,  2])

もう1つの興味深いアプローチは、以下を使用することwhereです。

>>> numpy.where(a <= 2, a, 2)
array([ 1,  2,  2, -4,  2])

最後に、aixの答えを考えてみましょうclip自己文書化であるため、単純な操作が好きですが、より複雑な操作には彼の答えが望ましいです。


1
OPは負の値を置き換えたいだけなので、a.clip(0)で十分です。a.clip(0、10)は10の上方何かを排除する
うさぎ

1
@ Hiett-試してみたところ、クリップが1つかかります。最初は最小と想定されます。
うさぎ

numpyのバージョンの問題である必要があります-ここに私の出力があります:(Pdb)np.clip(w、0)*** TypeError:clip()は少なくとも3つの引数を取ります(2つ指定)-一方:(Pdb)np.clip( w、0,1e6)array([[0.、0.605]])
bph

1
@Hiett、どのバージョンのnumpy?あなたは、クリップしてみてくださいましたメソッドのをa?組み込み関数でnumpy.clipも同じエラーが発生しますが、メソッドでは発生しません。
センダール2012

ええ、そのように呼ぶと、うまくいくようです。
bph 2012

10

numpyを使用しない別のミニマリストPythonソリューション:

[0 if i < 0 else i for i in a]

追加の関数を定義する必要はありません。

a = [1, 2, 3, -4, -5.23, 6]
[0 if i < 0 else i for i in a]

収量:

[1, 2, 3, 0, 0, 6]

1
それは素晴らしいです-リスト内包表記内にifステートメントを配置する構文はどうなるのだろうかと思っていました-forループの後にそれを貼り付けてから、2つの値を取得することで間違っていました(例では[0、0])リスト
bph 2012

最初にリスト内包表記について学び、理解度をテストするためにさまざまなことを試していたときも同じことをしました。私にとっても、forループの後に置く方が直感的でした。しかし、これはそうです:)for適用の前に置くと、リストのすべての要素に適用され、後に置くと、条件が満たされた場合にのみ、結果のリストに入れられます。
Levon 2012

2
@Hietti < 0 ? 0 : iリスト内包表記内で(Cの)三項演算子を使用しているだけです。わかりやすくするために角かっこを入れます[(0 if i < 0 else i) for i in a]。if afterを置くことは、リスト式コンストラクトのフィルター部分を使用しています。[(i) for i in a if i < 0]ゼロ未満のアイテムのリストのみを返します。
ポールS

2
Numpyは、コンパイルされたcコードによって多くの計算を実行するため、強力であり、したがって高速です。この方法を他の方法と比較すると、速度係数の差はほぼ10倍になります(これは遅いです)。したがって、直感的で読みやすいものの、これは間違いなく計算集約型ではありません。
rspencer 2016


2

NumPyを使用せずにPythonでそれを行う方法は次のとおりです。必要なものを返す関数を作成し、リスト内包表記またはマップ関数を使用します。

>>> a = [1, 2, 3, -4, 5]

>>> def zero_if_negative(x):
...   if x < 0:
...     return 0
...   return x
...

>>> [zero_if_negative(x) for x in a]
[1, 2, 3, 0, 5]

>>> map(zero_if_negative, a)
[1, 2, 3, 0, 5]

1
はこのルートをたどっていましたが、numpyでそれを行うにはもっと簡単でmatlabの少ないpythonの方法があるはずだと思いました(とにかくリストではなく配列を使用していたので)。クリップは完璧です
bph 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.