在Numpy中生成对称矩阵

Rya*_*yan 27 python random numpy matrix adjacency-matrix

我试图在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
Run Code Online (Sandbox Code Playgroud)

Jos*_*del 41

你可以这样做:

import numpy as np

N = 100
b = np.random.random_integers(-2000,2000,size=(N,N))
b_symm = (b + b.T)/2
Run Code Online (Sandbox Code Playgroud)

您可以在np.random等效的scipy模块中选择您想要的任何分布.

更新:如果您正在尝试构建类似图形的结构,请务必查看networkx包:

http://networkx.lanl.gov

它有许多内置例程来构建图形:

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

此外,如果要添加一些随机放置的零,您始终可以生成一组随机索引并将值替换为零.

  • @Ryan:你关心随机条目有什么样的分布吗?如果你添加`b + bT`,你会得到一个集中在0左右的非均匀分布. (4认同)
  • @unutbu,true,然后使用`np.tril(a)+ np.tril(a,-1).T`. (2认同)

Ben*_*man 24

我最好这样做:

a = np.random.rand(N, N)
m = np.tril(a) + np.tril(a, -1).T
Run Code Online (Sandbox Code Playgroud)

因为在这种情况下,矩阵的所有元素都来自相同的分布(在这种情况下是均匀的).

  • 这是保持相同分布的一种非常优雅的方式! (3认同)