【NumPy】配列の要素をマスクして特定の要素で計算する
2024-2-9
PythonでNumPyを使って配列の要素をマスクして特定の要素で最大値、最小値や平均値などのいろいろな計算したい!
概要
今回の記事では、PythonでNumPyを使って配列の要素をマスクして特定の要素で最大値、最小値や平均値などのいろいろな計算する手順を掲載する。
仕様書
環境
- Python 3.11.5
手順書
下記のような感じでsrc
とmask
という2次元配列があって、maskで0
となってる位置のsrc
の要素にのみで最大値と最小値を計算したい。
src = np.array([
[1,2,3],
[4,5,6],
[7,8,9],
])
mask = np.array([
[1,0,1],
[0,1,0],
[1,0,1],
])
0
となってる位置のsrc
の要素で最大値と最小値を求めると最大値は8
、最小値は2
になる。
実際に動くコードはこんな感じ。
import numpy as np
src = np.array([
[1,2,3],
[4,5,6],
[7,8,9],
])
mask = np.array([
[1,0,1],
[0,1,0],
[1,0,1],
])
masked_src = np.ma.masked_array(src, mask)
print(masked_src)
masked_max = masked_src.max()
masked_min = masked_src.min()
print(f"masked_max: {masked_max}, masked_min: {masked_min}")
こんな感じに出力されればOK。
[[-- 2 --]
[4 -- 6]
[-- 8 --]]
masked_max: 8, masked_min: 2
np.ma.masked_array
の第2引数で渡してる配列mask
で1
(1
以上の値でも可)の要素の位置の配列src
の要素がマスクされる。マスクされるとは隠されて計算に影響を与えなくなるような感じ。この時、マスクされた要素のデータは消えた訳でないことに注意。
マスクした要素を解除するにはmasked_src.mask = False
のように属性mask
をFalse
に設定する。
マスクを解除して配列全体から最大値と最小値を求めるにはこんな感じ。
masked_src.mask = False
unmasked_max = masked_src.max()
unmasked_min = masked_src.min()
print(f"unmasked_max: {unmasked_max}, unmasked_min: {unmasked_min}")
下記のような感じに出力されればOKだ!
unmasked_max: 9, unmasked_min: 1
NumPyの配列をマスクする方法はいろいろあって、そのいろいろある中のnp.ma.masked_where
を使うサンプル。
3
の倍数以外の値の要素をマスクしてる。(余剰で判定してるので性格には3
の倍数ではない)
print( np.ma.masked_where(src % 3, src) )
こんな感じに出力される。
[[-- -- 3]
[-- -- 6]
[-- -- 9]]
まとめ(感想文)
画像編集とかやってるとアルファ値的な感じで0
がマスクされるような感覚があるんだけども、1
がマスクされることに注意。