質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

489閲覧

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

negicubic

総合スコア9

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/10/16 09:57

前提

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

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

試したこと

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

Python

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

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

Python

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

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

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

R

1#乱数発生数の設定 2Nrand = 100 3#配列準備 4array1 = array2 <- matrix(0, nrow=Nrand, ncol=1) 5#乱数発生 6r <- round(runif(Nrand, min=0, max=150),1) 7for (i in 1:Nrand){ 8 if (i%%2==0){array1[i] <- r[i]} 9 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のように書くと、array1 と array2 が 「同じ配列」を指すことになってしまうからです。

python

1#配列準備 2array1 = array2 = np.zeros(Nrand)

違うarrayにすれば解決するでしょう。

python

1#配列1準備 2array1 = np.zeros(Nrand) 3#配列2準備 4array2 = np.zeros(Nrand)

投稿2022/10/16 10:01

TakaiY

総合スコア14327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

negicubic

2022/10/16 10:53

解決致しました。 Pythonの仕様なのですね…、盲点でした。 迅速なご回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問