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

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

ただいまの
回答率

90.51%

  • Python

    11729questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,059

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

import numpy as np
import random

Nx=8
Ny=8

for i in range(0,Nx):
    for j in range(0,Ny):
        i=np.random(0,(2*np.pi))
        j=np.random(0,(2*np.pi))
        k=np.array(i,j)
        print(k)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+3

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

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)
[[1.54705128 3.38768732 4.66927266 4.93956694 5.57902408 1.32860637
  5.33600137 3.88158682]
 [1.8115985  2.98562549 6.22309407 2.1017263  1.81204158 4.04397841
  6.20555177 1.40457946]
 [1.28836296 5.86996653 1.98725217 5.63716363 4.45858492 6.15640615
  3.79913445 5.46709472]
 [4.71719942 0.68920459 6.18046556 2.18383131 1.21146548 2.08486771
  6.18419119 1.31532943]
 [0.94368707 0.8345513  5.99159409 1.42235154 4.82683858 0.24194396
  4.03298026 1.30280098]
 [0.00757902 6.10479803 2.08001683 0.64880397 1.35331258 6.18893706
  5.23522296 0.39701916]
 [3.79621501 2.1301009  4.27071524 3.87395281 4.32676251 1.15681418
  4.99716436 5.20491587]
 [2.04698482 4.25620576 0.01032738 3.3380622  1.59542291 1.02841777
  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として計算しています。

a = np.random.uniform(0, 2 * np.pi, (8, 8))
x = np.empty_like(a)

# a を zero-padding
a = np.pad(a, (1, 1), 'constant', constant_values=0)
print(a.shape)  # (10, 10)

for i, j in np.dstack(np.mgrid[1:9, 1:9]).reshape(-1, 2):
    x[i - 1, j - 1] = -np.cos(a[i, j] - a[i - 1, j]) \
                      - np.cos(a[i, j] - a[i + 1, j]) \
                      - np.cos(a[i, j] - a[i, j + 1]) \
                      - np.cos(a[i, j] - a[i, j - 1])
print(x)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/16 22:37

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

    キャンセル

+3

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

でよいのでは

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/16 21: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)というナンバリングをしたいと考えておりました。可能であればこちらについてもアイデアをいただけないでしょうか。

    キャンセル

+1

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

import numpy as np

Nx=8
Ny=8

mat = np.zeros((Nx, Ny))

for i in range(0,Nx):
    for j in range(0,Ny):
        k = np.random.random()*2*np.pi
        mat[i, j] = k
        print(k)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Python

    11729questions

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