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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

15625閲覧

python 二次元の乱数行列を作りたい

astromelt0416

総合スコア15

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/10/16 12:31

閲覧ありがとうございます。
pythonで二次元の乱数配列を作りたいと考えています。
具体的には8×8の行列でそれぞれの要素が0~2πの乱数をとるというものです。
また、行列の要素を(i,j)とナンバリングしたいです。
以下に自分か考えている過程を貼ります。実行するとTypeError: 'module' object is not callable が出てしまいこれ以上先に進めません。よろしくお願い致します。

python

1 2import numpy as np 3import random 4 5Nx=8 6Ny=8 7 8for i in range(0,Nx): 9 for j in range(0,Ny): 10 i=np.random(0,(2*np.pi)) 11 j=np.random(0,(2*np.pi)) 12 k=np.array(i,j) 13 print(k)

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

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

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

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

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

guest

回答4

0

ベストアンサー

各値が乱数で初期化された行列を作成する

numpy.random.uniform(low=0.0, high=1.0, size=None) で [low, high) の一様分布に従う乱数を生成できます。

今回の場合、[0, 2pi) の 8x8 行列なので、low=0, high=2 * np.pi, size=(8, 8) となります。

import numpy as np a = np.random.uniform(0, 2 * np.pi, (8, 8)) print(a)

output

1[[1.54705128 3.38768732 4.66927266 4.93956694 5.57902408 1.32860637 2 5.33600137 3.88158682] 3 [1.8115985 2.98562549 6.22309407 2.1017263 1.81204158 4.04397841 4 6.20555177 1.40457946] 5 [1.28836296 5.86996653 1.98725217 5.63716363 4.45858492 6.15640615 6 3.79913445 5.46709472] 7 [4.71719942 0.68920459 6.18046556 2.18383131 1.21146548 2.08486771 8 6.18419119 1.31532943] 9 [0.94368707 0.8345513 5.99159409 1.42235154 4.82683858 0.24194396 10 4.03298026 1.30280098] 11 [0.00757902 6.10479803 2.08001683 0.64880397 1.35331258 6.18893706 12 5.23522296 0.39701916] 13 [3.79621501 2.1301009 4.27071524 3.87395281 4.32676251 1.15681418 14 4.99716436 5.20491587] 15 [2.04698482 4.25620576 0.01032738 3.3380622 1.59542291 1.02841777 16 2.35780556 4.79860949]]

行列の要素を (i, j) とした行列を作成する方法

numpy.mgrid を使うと以下のような行列が作成できます。

X, Y = np.mgrid[0:8, 0:8]
X [[0 0 0 0 0 0 0 0] [1 1 1 1 1 1 1 1] [2 2 2 2 2 2 2 2] [3 3 3 3 3 3 3 3] [4 4 4 4 4 4 4 4] [5 5 5 5 5 5 5 5] [6 6 6 6 6 6 6 6] [7 7 7 7 7 7 7 7]] Y [[0 1 2 3 4 5 6 7] [0 1 2 3 4 5 6 7] [0 1 2 3 4 5 6 7] [0 1 2 3 4 5 6 7] [0 1 2 3 4 5 6 7] [0 1 2 3 4 5 6 7] [0 1 2 3 4 5 6 7] [0 1 2 3 4 5 6 7]]

これを dstack() で結合することで、各要素が (i, j) となる配列が作成できます。

XY = np.dstack([X, Y]) print(XY) print(XY.shape) # (8, 8, 2) print(XY[0, 2]) # [0 2]
[[[0 0] [0 1] [0 2] [0 3] [0 4] [0 5] [0 6] [0 7]] [[1 0] [1 1] [1 2] [1 3] [1 4] [1 5] [1 6] [1 7]] ... 略

一行でかくなら

XY = np.dstack(np.mgrid[0:8, 0:8])

追記

コメント欄の計算をするなら、こうですね。
1,8列と1,8行の端の処理が不明だったので、範囲外の値は0として計算しています。

python

1a = np.random.uniform(0, 2 * np.pi, (8, 8)) 2x = np.empty_like(a) 3 4# a を zero-padding 5a = np.pad(a, (1, 1), 'constant', constant_values=0) 6print(a.shape) # (10, 10) 7 8for i, j in np.dstack(np.mgrid[1:9, 1:9]).reshape(-1, 2): 9 x[i - 1, j - 1] = -np.cos(a[i, j] - a[i - 1, j]) \ 10 - np.cos(a[i, j] - a[i + 1, j]) \ 11 - np.cos(a[i, j] - a[i, j + 1]) \ 12 - np.cos(a[i, j] - a[i, j - 1]) 13print(x)

投稿2018/10/16 12:55

編集2018/10/16 13:30
tiitoi

総合スコア21956

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

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

astromelt0416

2018/10/16 13:37

tiitoi様 今質問しようとしていたことまで先に対応していただきありがとうございます。1,8列と1,8行については折り返しの周期的境界条件を用いる予定なので大丈夫です。ひとまず先に進めそうなので、一度自分でやってみます。
guest

0

Python

1np.random.uniform(0, 2*np.pi, (8,8))

でよいのでは

投稿2018/10/16 12:51

magichan

総合スコア15898

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

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

0

なるべくもとのコードに似せるとこうですかね。

python

1import numpy as np 2 3Nx=8 4Ny=8 5 6mat = np.zeros((Nx, Ny)) 7 8for i in range(0,Nx): 9 for j in range(0,Ny): 10 k = np.random.random()*2*np.pi 11 mat[i, j] = k 12 print(k)

投稿2018/10/16 13:18

tachikoma

総合スコア3601

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

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

0

ループを使わなくても、一発で作れます。

Python

1>>> import numpy as np 2>>> np.random.rand(8, 8) * np.pi * 2 3array([[1.86058262, 6.0195474 , 1.21928733, 2.78226953, 4.67355348, 4 4.48378688, 0.14930246, 5.10928459], 5 [3.32913283, 2.25855259, 3.60431358, 1.576406 , 1.58691154, 6 4.32170216, 0.07328059, 4.72837847], 7 [2.47585481, 2.63294816, 5.90108858, 3.82178083, 2.51759349, 8 6.17632324, 6.03989705, 2.96795237], 9 [1.50381139, 1.70566243, 3.02550474, 1.62943053, 1.81694459, 10 0.37302033, 5.41886769, 5.0505939 ], 11 [0.15542716, 1.36379851, 1.99723294, 4.51375228, 6.12276593, 12 4.59864151, 1.22853212, 1.47893226], 13 [4.18617182, 3.06918583, 4.46794025, 1.22262086, 2.2623329 , 14 5.30169909, 6.17214356, 0.63686351], 15 [3.04488415, 3.57240172, 0.45584975, 5.56452399, 5.31371874, 16 5.54464866, 2.69240115, 0.96051532], 17 [3.29616727, 0.72078455, 0.38238567, 3.40152652, 3.72072533, 18 0.29256473, 4.22329522, 5.28913289]])

また、行列の要素を(i,j)とナンバリングしたいです。

これに関しては目的がよく分かりません。
特定の要素にアクセスするのならインデックスは既知ですし。

投稿2018/10/16 12:46

LouiS0616

総合スコア35660

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

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

astromelt0416

2018/10/16 12:57

回答ありがとうございます。実はこの次に行列の要素を(i,j)として(LouiS0616様が出力してくださった回答の例でいうと(1.1)=1.86058262です)x=-cos((i,j)-(i-1,j))-cos((i,j)-(i+1,j))-cos((i,j)-(i,j+1))-cos((i,j)-(i,j-1)) という値xをすべての(i,x)において計算したいと考えており、そのために(i,j)というナンバリングをしたいと考えておりました。可能であればこちらについてもアイデアをいただけないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問