【python】配列内要素の順番をランダムに並べ替える方法!

この記事では、pythonの配列の中身をシャッフルする方法をご紹介します。

 

以下の2つのパターンに分けてご紹介していきます。

〇numpyのシャッフル機能を使用する方法

〇for文と配列加工スキルを使って自力でシャッフルする方法

 

自力で配列をシャッフルする方法を習得しておけば、機械学習の教師データを作成する際に、インプットデータとアウトプットデータの対応関係を維持した状態で配列をシャッフルしたりできるようになります。

ぜひやり方だけは覚えておきましょう。

※2つの配列の対応関係を維持した状態でシャッフルする方法はまた別記事でご紹介します。

 

それではさっそくやっていきましょう。

スポンサーリンク

numpyのshuffle機能で配列内要素をシャッフルする方法

それではまずはnumpyのshuffle機能を使う方法をご紹介していきます。

 

やり方は以下の通りです。

np.random.shuffle(シャッフルしたい配列名)

 

非常に簡単ですね。

 

実際にやってみましょう。

今回は以下のテキストデータを配列として読み込み、シャッフルしてみましょう。

シャッフルに使用するサンプルデータ

以下がサンプルコードです。

import numpy as np
data=np.loadtxt('data.txt',np.uint16)
print(data)
np.random.shuffle(data)
print(data)

 

こいつを実行すると以下の結果が出力されました。

〇シャッフル前の配列出力結果

シャッフル前のサンプルデータ

〇シャッフル後の配列出力結果

シャッフル後のサンプルデータ

というわけで問題なく配列の並びをシャッフルできていますね。

ここまでがnumpyのshuffleスキルを使用した方法でした。

スポンサーリンク

for文と配列加工スキルで配列内要素をシャッフルする方法

次はfor文と配列加工スキルを組み合わせて、配列シャッフルを実行してみましょう。

 

いきなりですが、以下がそのサンプルコードです。

※具体的になにをしているかは後程ご紹介します。

import numpy as np
import random
data=np.loadtxt('data.txt',np.uint16)
print(data)
for i in range(20):
    rnd1=random.randint(0,len(data)) 
    rnd2=random.randint(rnd1,len(data))
    data=np.append(data,data[rnd1:rnd2],0)
    data=np.delete(data,np.s_[rnd1:rnd2],0)
print(data)

 

こいつを実行すると以下の結果が出力されました。

〇シャッフル前の配列出力結果

シャッフル前のサンプルデータ

〇シャッフル後の配列出力結果

シャッフル後のサンプルデータ

こちらの方法でも問題なくシャッフルが実行されていますね。

 

次はこの処理の中でなにが行われているのかを簡単に解説しておきましょう。

このプログラムの中で行われている作業を図で表すと以下のような感じですね。

〇STEP1

For文を使った配列シャッフルのイメージ図

〇STEP2

For文を使った配列シャッフルのイメージ図

〇STEP3

For文を使った配列シャッフルのイメージ図

※この白部分は後ろの青とオレンジで勝手に埋められます。

 

これら3つの作業をfor文で20回繰り返しています。

まぁトランプを混ぜるときの作業を行っていると思ってもらえればOKです。

 

また、配列の行がたくさんある場合はfor文の繰り返し回数を多めにとっておかなければ十分にまぜくることができませんのでご注意ください。

 

スポンサーリンク

おわりに

というわけで今回はpythonの配列内要素をシャッフルする方法をご紹介しました。

AIの教師データを作成する際などによく使うスキルです。

ぜひ習得しておきましょう!

 

このように、私のブログでは様々なプログラミングスキルを紹介しています。

 

今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。

確実にスキルアップできるはずです。

 

最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村 IT技術ブログへ
にほんブログ村

それではまた!

コメント

タイトルとURLをコピーしました