2012-05-29 76 views
13

Tôi đang cố gắng tạo ra các ma trận đối xứng theo dạng gumpy. Cụ thể, các ma trận này có các mục nhập địa điểm ngẫu nhiên và trong mỗi mục nhập, nội dung có thể là ngẫu nhiên. Dọc theo đường chéo chính chúng ta không quan tâm đến những gì enties đang có trong đó, vì vậy tôi đã ngẫu nhiên những người là tốt.Tạo ma trận đối xứng trong Numpy

Cách tiếp cận tôi đã thực hiện là tạo ra một nxn tất cả các ma trận zero và chỉ đơn giản là lặp qua các chỉ số của ma trận. Tuy nhiên, xem xét looping là tương đối đắt tiền trong python, tôi tự hỏi nếu tôi có thể đạt được điều tương tự mà không cần sử dụng python cho vòng.

Có một số thứ được xây dựng thành gọn gàng cho phép tôi đạt được mục tiêu của mình hiệu quả hơn không?

Đây là mã hiện tại của tôi:

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 

Trả lời

18

Bạn chỉ có thể làm điều gì đó như:

import numpy as np 

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

Nơi bạn có thể chọn từ bất cứ phân phối mà bạn muốn trong np.random hoặc tương đương mô-đun scipy.

Cập nhật: Nếu bạn đang cố gắng để xây dựng cấu trúc đồ thị như thế nào, chắc chắn kiểm tra các gói networkx:

http://networkx.lanl.gov

trong đó có một số thói quen tích hợp để xây dựng đồ thị:

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

Ngoài ra nếu bạn muốn thêm một số số không được đặt ngẫu nhiên, bạn luôn có thể tạo một nhóm chỉ mục ngẫu nhiên và thay thế các giá trị bằng 0.

+0

Cảm ơn! Đó là một giải pháp hiệu quả. Tuy nhiên, có cách nào tôi có thể làm cho nó để đặt số không ở những nơi ngẫu nhiên? Ma trận này được cho là đại diện cho một loại ma trận kề cho một đồ thị, do đó, có một ma trận với số không phân phối ngẫu nhiên là thích hợp hơn. – Ryan

+4

@Ryan: Bạn có quan tâm đến loại phân phối mà các mục ngẫu nhiên có không? Nếu bạn thêm 'b + b.T', bạn sẽ nhận được một bản phân phối không đồng nhất tập trung quanh 0. – unutbu

+0

Tôi đang xác minh một số thuộc tính của ma trận.Nỗ lực của nó nhiều hơn là cung cấp bằng chứng thuyết phục về một số tính chất toán học, do đó sự phân bố ở đây không quan trọng lắm. Cảm ơn mặc dù! – Ryan

13

tôi sẽ làm tốt hơn:

a = np.random.rand(N, N) 
m = np.tril(a) + np.tril(a, -1).T 

vì trong trường hợp này tất cả các yếu tố của một ma trận là từ cùng phân phối (thống nhất trong trường hợp này).

+0

Đó là cách rất thanh lịch để giữ cùng phân phối! – Arash

0

Nếu bạn không nhớ có số không trên đường chéo bạn có thể sử dụng đoạn mã sau:

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 

Lưu ý rằng bạn chỉ cần để tạo ra n * (n-1)/2 biến ngẫu nhiên do sự đối xứng.

0

Tôi đang sử dụng các chức năng sau đây để tạo ra một đối xứng matrix cả theo chiều dọc và theo chiều ngang:

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]) 

Hãy kiểm tra cách hoạt động:

>>> 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]]) 
Các vấn đề liên quan