NumPy配列での三項演算子ベクトル計算版

np.where三項演算子のベクトル計算といえる。

3つの引数を取り、1つ目が条件式、つまり論理値のndarray、2つ目が条件がtrueのときの値、3つ目が条件がfalseのときの値。

例その1

ndarr1 = np.array([1, 2, 3, 4, 5])
ndarr2 = np.array([10, 20, 30, 40, 50])
cond = np.array([True, False, True, True, False])
print(np.where(cond, ndarr1, ndarr2))
# 出力結果
# [ 1 20  3  4 50]

例その2

ndarr1 = np.random.rand(4, 2) - 0.5
ndarr2 = np.zeros((4, 2), dtype='float64')

print(ndarr1)
# 出力結果
# [[-0.32185056  0.0451717 ]
#  [ 0.04564159 -0.15487149]
#  [-0.04431453 -0.45999036]
#  [-0.3508403   0.0938512 ]]

print(ndarr2)
# 出力結果
# [[ 0.  0.]
#  [ 0.  0.]
#  [ 0.  0.]
#  [ 0.  0.]]

ndarr3 = np.where(ndarr1 > 0.0, ndarr1, ndarr2)

print(ndarr3)
# 出力結果
# [[ 0.          0.0451717 ]
#  [ 0.04564159  0.        ]
#  [ 0.          0.        ]
#  [ 0.          0.0938512 ]]

np.random.rand(4, 2) - 0.5 は 4 × 2 の行列の各要素を0から1までの乱数にして、さらにベクトル計算のブロードキャストにより各要素から 0.5 を引いた行列を生成する。

次の例のように2つ目や3つ目の引数はndarrayでなくてスカラーでも構わない。これは np.where でベクトル計算のブロードキャストするイメージ。

例その3

ndarr1 = np.random.rand(4, 2) - 0.5

print(ndarr1)
# 出力結果
# [[-0.48128308  0.27579344]
#  [ 0.36287708  0.26540085]
#  [ 0.42619999  0.29142238]
#  [-0.15820554 -0.35493536]]

ndarr3 = np.where(ndarr1 > 0.0, ndarr1, 0.0)

print(ndarr3)
# 出力結果
# [[ 0.          0.27579344]
#  [ 0.36287708  0.26540085]
#  [ 0.42619999  0.29142238]
#  [ 0.          0.        ]]
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。