PythonのリストとNumpy配列を並び替えたときの違いについて

PythonのリストとNumpy配列を並び替えたときの違いについてPython 動画に写る人の中から3人を検出する方法で最初に投稿してしまった間違った動画間違ったプログラムを交えて紹介します。

下のプログラムは「Python 動画に写る人の中から3人を検出する方法」で作成したプログラムから抜粋したものなので、実行しても動かないです。

目次

・間違っていたプログラム

・正解のプログラム

・補足

・動画のプログラムとは別でリストとNumpy配列の並び替えを実行して比較

・list

・Numpy配列

・Numpy配列からリストに変換して実行


間違っていたプログラム

↑このプログラムは人を検出した座標の高さの値をもとに、Numpy配列大きい順(降順)に並び替えるプログラムになります。念のためにprint(type(images))で確認するとclass ‘numpy.ndarray’が表示されるので、Numpy配列で並び替えができています。

このプログラムをprint文で並び替える前を全体、並び替えたものを並び替え、そして、座標(高さの値)の大きい順に1~3番目をつけて表示したのがこちら↓になります。

1番目[258,167,80,160]→2番目[158,198,71,142]→3番目[42,184,67,135]のように、1番右側の値(高さの値)をもとに、大きい順(降順)に並び替えをしたのですが、うまくいっていないです。

その並び替えができていない座標を使って、四角で囲んでいるのがこの↓動画になります。

青 => 緑=> 赤の大きい順に囲んでいるように見えるのですが、プログラムが間違っています。

プログラムの間違えを解決したのがこちら↓のプログラムになります。

正解のプログラム

for文とif文を使った並び替えの前にimages=list(images)をしてNumpy配列からリストに変換しています。そして、並び替えが終わるとimages=np.array(images)をしてNumpy配列に戻しています。これも念のためにprint(type(images))で確認するとclass ‘list’が表示されるので、listで並び替えができています。

このプログラムも同様にprint文で並び替える前を全体、並び替えたものを並び替え、そして、座標(高さの値)の大きい順に1~3番目をつけて表示したのがこちら↓になります。

リストに変換して並び替えを行うと1番目[258,167,80,160]→2番目[158,198,71,142]→3番目[42,184,67,135]のように、1番右側の値(高さの値)をもとに、大きい順(降順)に並び替えができています。

正しく並び替えができた座標を使って、四角で囲んでいるのがこの↓動画になります

補足

images=np.array(images)をしてNumpy配列に戻さなくても、人を検出して四角で囲む表示ができました。

動画のプログラムとは別でリストとNumpy配列の並び替えを実行して比較

list

↓実行結果↓

リストだと1番右側の値(3,10,7)をもとに、大きい順(降順)に並び替えができています。

Numpy配列

↓実行結果↓

このプログラムも人検出プログラムと同じで1番右側の値(3,10,7)をもとに、大きい順(降順)に並び替えしたのですが、うまくいっていないです。

Numpy配列からリストに変換して実行

↓実行結果↓

data2=list(data2)でNumpy配列からリストに変換して実行するとうまくいきます。