Python - numpy - ary[ary>3]=999 の仕組みについて

公開日:2019-05-31 更新日:2019-06-13
[Python]

1. 概要

numpy の ndarray は、以下のように角括弧 [] の中に条件を指定して、条件に該当する要素に対してだけ値を代入することができます。
これが動いている仕組みについて説明します。

import numpy as np

ary = np.array(range(1, 6))
ary[ary > 3] = 999

print(ary) #[  1   2   3 999 999]

2. 動画



3. 条件による一括代入の仕組み

以下のようにすると、条件による一括代入が行えます。

1. 演算子「>」を実装して、要素毎に条件に一致するかどうかを bool の配列に入れて返す。
2. []のセッターで、通常はキーを受け取るところを、上記 bool の配列を受け取るようにして、True の場合のみ、値を代入するようにする。

ソースは以下になります。
実際には「>」以外の演算子も実装する必要があります。
class TestArray:
    
    # コンストラクタ
    def __init__(self):
        self.ary = [1, 2, 3, 4, 5]

    # 値の表示用
    def __str__(self):
        return str(self.ary)
    
    # 演算子「>」の定義
    # 要素の値 > 引数、の結果(bool)を配列にして返す
    def __gt__(self, value):
        return [True if v > value else False for v in self.ary]
    
    # [] のセッター  インデックスではなく、配列を受け取る
    def __setitem__(self, boolAry, value):
        for i in range(0, len(boolAry)):
            b = boolAry[i]
            
            if b == True:
                self.ary[i] = value;


# bool の配列の取得
ary1 = TestArray()
print( ary1 > 3 ) #[False, False, False, True, True]

# True の要素だけ設定
ary1 = TestArray()
ary1[ [False, False, False, True, True] ] = 999
print(ary1) #[1, 2, 3, 999, 999]

# 上記2つを組み合わせて、条件に一致する要素だけ設定
ary1 = TestArray()
ary1[ ary1 > 3 ] = 999
print(ary1) #[1, 2, 3, 999, 999]