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 の場合のみ、値を代入するようにする。
ソースは以下になります。
実際には「>」以外の演算子も実装する必要があります。
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]