1. ホーム
  2. python

[解決済み] Pythonでx[x < 2] = 0は何を意味するのか?

2023-05-08 07:40:06

質問

以下のような行があるコードに出会いました。

x[x<2]=0

バリエーションで遊んでみても、この構文が何をするものなのか、まだ行き詰っています。

例を挙げます。

>>> x = [1,2,3,4,5]
>>> x[x<2]
1
>>> x[x<3]
1
>>> x[x>2]
2
>>> x[x<2]=0
>>> x
[0, 2, 3, 4, 5]

どのように解決するのですか?

これは NumPy 配列 . リストでの動作は無駄であり、Python 2に特有のものです(Python 3ではありません)。元のオブジェクトが本当にリストではなく、NumPyの配列(さらに以下を参照)であったかどうかを再確認したいかもしれません。

しかし、あなたのコードでは、xは単純なリストです。

から

x < 2

は偽 すなわち0、したがって

x[x<2]x[0]

x[0] は変更されます。

逆に x[x>2]x[True] または x[1]

だから x[1] は変更されます。

なぜこのようなことが起こるのでしょうか?

比較のルールは

  1. 2つの文字列や2つの数値型を順序付ける場合、順序付けは期待通りの方法で行われます(文字列の場合は辞書式順序付け、整数の場合は数値式順序付け)。

  2. 数値型と非数値型を並べた場合、数値型が先になります。

  3. どちらも数値型ではない互換性のない2つの型を注文した場合、それらの型名のアルファベット順で並べられます。

つまり、次のような順序になります。

数値 < リスト < 文字列 < タプル

の受理済み回答を参照してください。 Pythonはどのように文字列とintを比較するのですか? .

xがNumPyの配列である場合 のため、この構文はより理にかなっています。 ブーリアン配列のインデックス . その場合 x < 2 の各要素がブーリアンであるかどうかを表すブーリアンの配列です。 x の各要素が 2 よりも小さいかどうかを表す boolean の配列です。 x[x < 2] = 0 の要素を選択する。 x の要素のうち、2 より小さいものを選び、それらのセルを 0 に設定します。 インデックス作成 .

>>> x = np.array([1., -1., -2., 3])
>>> x < 0
array([False,  True,  True, False], dtype=bool)
>>> x[x < 0] += 20   # All elements < 0 get increased by 20
>>> x
array([  1.,  19.,  18.,   3.]) # Only elements < 0 are affected