39

numpy で対称行列を生成しようとしています。具体的には、これらの行列にはランダムな場所のエントリがあり、各エントリの内容はランダムにすることができます。主な対角線に沿って、そこにあるエンティティは関係ないので、それらもランダム化しました。

私が取ったアプローチは、最初にnxnのすべてゼロの行列を生成し、単に行列のインデックスをループすることです. ただし、ループはPythonで比較的高価であることを考えると、Pythonのforループを使用せずに同じことを達成できるかどうか疑問に思っています。

より効率的に目標を達成できるように、numpy に組み込まれているものはありますか?

これが私の現在のコードです:

import numpy as np
import random

def empty(x, y):
    return x*0

b = np.fromfunction(empty, (n, n), dtype = int)

for i in range(0, n):
    for j in range(0, n):
        if i == j:
            b[i][j] = random.randrange(-2000, 2000)
        else:
            switch = random.random()
            random.seed()
            if switch > random.random():
                a = random.randrange(-2000, 2000)
                b[i][j] = a
                b[j][i] = a
            else:
                b[i][j] = 0
                b[j][i] = 0
4

7 に答える 7

58

次のようなことができます:

import numpy as np

N = 100
b = np.random.random_integers(-2000,2000,size=(N,N))
b_symm = (b + b.T)/2

np.randomまたは同等の scipy モジュールで必要なディストリビューションから選択できる場所。

更新:グラフのような構造を構築しようとしている場合は、networkx パッケージを確認してください。

http://networkx.lanl.gov

これには、グラフを作成するための組み込みルーチンがいくつかあります。

http://networkx.lanl.gov/reference/generators.html

また、ランダムに配置されたゼロをいくつか追加したい場合は、いつでもランダムな一連のインデックスを生成し、値をゼロに置き換えることができます。

于 2012-05-29T21:26:29.703 に答える
0

対角線にゼロがあっても構わない場合は、次のスニペットを使用できます。

def random_symmetric_matrix(n):
    _R = np.random.uniform(-1,1,n*(n-1)/2)
    P = np.zeros((n,n))
    P[np.triu_indices(n, 1)] = _R
    P[np.tril_indices(n, -1)] = P.T[np.tril_indices(n, -1)]
    return P

対称性により、n*(n-1)/2 個の確率変数のみを生成する必要があることに注意してください。

于 2015-11-04T19:22:55.640 に答える
0

次の関数を使用して、マトリックスを垂直方向と水平方向の両方で対称にしています。

def make_sym(a):
    w, h = a.shape
    a[w - w // 2 :, :] = np.flipud(a[:w // 2, :])
    a[:, h - h // 2:] = np.fliplr(a[:, :h // 2])

それがどのように機能するかを確認しましょう:

>>> m = (np.random.rand(10, 10) * 10).astype(np.int)
>>> make_sym(m)
>>> m
array([[2, 7, 5, 7, 7, 7, 7, 5, 7, 2],
       [6, 3, 9, 3, 6, 6, 3, 9, 3, 6],
       [1, 4, 6, 7, 2, 2, 7, 6, 4, 1],
       [9, 2, 7, 0, 8, 8, 0, 7, 2, 9],
       [5, 5, 6, 1, 9, 9, 1, 6, 5, 5],
       [5, 5, 6, 1, 9, 9, 1, 6, 5, 5],
       [9, 2, 7, 0, 8, 8, 0, 7, 2, 9],
       [1, 4, 6, 7, 2, 2, 7, 6, 4, 1],
       [6, 3, 9, 3, 6, 6, 3, 9, 3, 6],
       [2, 7, 5, 7, 7, 7, 7, 5, 7, 2]])
于 2016-12-16T12:09:08.657 に答える