【NumPy】配列の要素をマスクして特定の要素で計算する

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【NumPy】配列の要素をマスクして特定の要素で計算する

2024-2-9

PythonでNumPyを使って配列の要素をマスクして特定の要素で最大値、最小値や平均値などのいろいろな計算したい!

概要

今回の記事では、PythonでNumPyを使って配列の要素をマスクして特定の要素で最大値、最小値や平均値などのいろいろな計算する手順を掲載する。

仕様書

環境

  • Python 3.11.5

手順書

下記のような感じでsrcmaskという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引数で渡してる配列mask11以上の値でも可)の要素の位置の配列srcの要素がマスクされる。マスクされるとは隠されて計算に影響を与えなくなるような感じ。この時、マスクされた要素のデータは消えた訳でないことに注意。

マスクした要素を解除するにはmasked_src.mask = Falseのように属性maskFalseに設定する。

マスクを解除して配列全体から最大値と最小値を求めるにはこんな感じ。

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がマスクされることに注意。