【NumPy】2次元ndarrayのそれぞれの行で条件を満たす最後の要素のインデックスを取得する方法[Python]

  • URLをコピーしました!
目次

NumPy

前回、Pandasのデータフレーム中の最大値、最小値を取得する方法を紹介しました。

今回はNumPyで2次元ndarrayのそれぞれの行で条件を満たす最後の要素のインデックスを取得する方法を紹介します。

どういう状況かというとこちらのような2次元ndarrayがあったとします。

data_list = [[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
             [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
             [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

各行は「0」、「1」で構成されており、それぞれの行における一番最後の「1」のインデックスを取得したいといったときのテクニックです。

それでは始めていきましょう。

それぞれの行で条件を満たす最後の要素のインデックスを取得

まず各行の条件を満たす要素のインデックス(上の例では全ての「1」のインデックス)を取得する場合を考えていきます。

その場合、まずfor文を使って各行のndarrayを取得し、「np.where(条件)」を使って条件に当てはまる要素のインデックスを取得します。

import numpy as np

data_list = [[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
             [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
             [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

for data in data_list:
    ind = np.where(np.array(data) == 1)[0]
    print(ind)

実行結果
[5 6 7 8 9]
[ 3  4  5  6  7  8  9 10 11 12]
[0 1 2 3 4 5 6]
[10 11 12 13 14]
[]

得られたインデックスのうち、最後のインデックスを取得するため、「ndarray[-1]」とします。

ただし条件を満たす要素が含まれていない場合もあり得るため、条件を満たす要素のndarrayの長さが「0」の時用にif文を使って条件分岐をします。

import numpy as np

data_list = [[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
             [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
             [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
             [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

last_data = []
for data in data_list:
    ind = np.where(np.array(data) == 1)[0]
    if len(ind) != 0:
        last_data.append(ind[-1])
    elif len(ind) == 0:
        last_data.append(None)

print(last_data)

実行結果
[np.int64(9), np.int64(12), np.int64(6), np.int64(14), None]

次回はSciPyを使ってノコギリ波、三角波、矩形波、チャープ信号の生成方法を紹介します。

ではでは今回はこんな感じで

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次