【Python】発生した乱数配列に対して一行ごとに0を挟みたい

前提

Pythonを用いて一行おきに0を格納するようなプログラムを作成しています。

実現したいこと

0~100の範囲で乱数を発生させ、一行ごとに0を挟むベクトルを2個作りたいと考えております。

そのベクトルの0を格納する位置は一方は奇数行、もう一方は偶数行にしたく、

array1 = [1,0,2,0,3,0,4,...]
array2 = [0,5,0,6,0,7,0,...]

のような形です。

発生している問題・エラーメッセージ

最初にゼロ行列を作成し、for文とif文を組み合わせて、奇数行、偶数行に乱数を割り振るという処理を行っているのですが、

array1 = [1,2,3,4,5,6,7,...]
array2 = [1,2,3,4,5,6,7,...]

という感じでif文で処理を分けているはずなのに両方のベクトルに同じ値が格納されてしまいます。

該当のソースコード

Python

#乱数発生数の設定Nrand = 100#配列準備array1 = array2 = np.zeros(Nrand)#乱数発生r = np.round([random.uniform(0,100) for i in range(0, Nrand)],1)#各行に0を挟むように処理for i in range(0, Nrand): if i%2==0: array1[i] = r[i] else: array2[i] = r[i]

試したこと

以下のようにif文の後にprintで結果を出力させて、所望の値が出力されているか確認しました。

Python

#乱数発生数の設定Nrand = 100#配列準備array1 = array2 = np.zeros(Nrand)#乱数発生r = np.round([random.uniform(0,100) for i in range(0, Nrand)],1)#各行に0を挟むように処理for i in range(0, Nrand): if i%2==0: print(f"array1:{i}:{r[i]}") array1[i] = r[i] else: print(f"array2:{i}:{r[i]}") array2[i] = r[i]

すると、以下のような出力がなされ、出力に関しては問題なさそうです。

Python

Output exceeds the size limit. Open the full output data in a text editor array1:0:54.0array2:1:11.0array1:2:62.2array2:3:5.9

ですが、何故か一方のif文しか実行されないはずの格納が両方のベクトルに対して実行されてしまい、困っています。

一方、Rで同様の処理を行ったところ出来ました。下記のコードです。

R

#乱数発生数の設定Nrand = 100#配列準備array1 = array2 <- matrix(0, nrow=Nrand, ncol=1)#乱数発生r <- round(runif(Nrand, min=0, max=150),1)for (i in 1:Nrand){ if (i%%2==0){array1[i] <- r[i]} else{array2[i] <- r[i]}

時間が無ければRでデータフレームを作成してからPythonで読み込ませて作業しても良いのですが、

幸いなことにまだ時間があるため可能ならば、Pythonに一本化させたく存じます。

何故Rで全部やらないのか?というご意見もあるかと存じますが、この乱数を発生させた後の別処理がPythonでしか実装しておらず、それをRで実装するのは時間が掛かりそうなので、最後の処理はPythonで行いたいためです。

長文失礼いたしました。ご教授お願いできますでしょうか。

補足情報(FW/ツールのバージョンなど)

Python 3.9.7
Jupyter Notebook
Visual Studio Code
R 4.1.2

コメントを投稿

0 コメント