2012-05-29 17 views
13

में सममित मैट्रिस उत्पन्न करना मैं समरूप में सममित मैट्रिक्स उत्पन्न करने की कोशिश कर रहा हूं। विशेष रूप से, इन मैट्रिस में यादृच्छिक स्थान प्रविष्टियां होती हैं, और प्रत्येक प्रविष्टि में सामग्री यादृच्छिक हो सकती है। मुख्य विकर्ण के साथ हम वहां मौजूद चीजों से चिंतित नहीं हैं, इसलिए मैंने उनको यादृच्छिक बना दिया है।न्यूम्पी

मैंने जो दृष्टिकोण लिया है वह पहले एनएक्सएन को सभी शून्य मैट्रिक्स उत्पन्न करता है और बस मैट्रिस के सूचकांक पर लूप उत्पन्न करता है। हालांकि, लूपिंग पर विचार करने के लिए पाइथन में अपेक्षाकृत महंगा है, मुझे आश्चर्य है कि क्या मैं पाइथन के लूप के बिना एक ही चीज़ को स्वीकार कर सकता हूं।

क्या कुछ चीजें 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 

उत्तर

18

तुम बस की तरह कुछ कर सकता है::

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

यदि आप यादृच्छिक रूप से रखे गए शून्यों की कुछ संख्या जोड़ना चाहते हैं, तो आप हमेशा इंडेक्स का एक यादृच्छिक सेट जेनरेट कर सकते हैं और शून्य के साथ मानों को प्रतिस्थापित करें।

+0

धन्यवाद! यह एक कुशल समाधान है। हालांकि, क्या मैं कुछ जगहों पर यादृच्छिक रूप से शून्य स्थानों को रखने के लिए इसे प्राप्त कर सकता हूं? यह मैट्रिक्स एक ग्राफ के लिए आसन्नता मैट्रिक्स के एक प्रकार का प्रतिनिधित्व करना चाहिए, इसलिए यादृच्छिक रूप से वितरित शून्य के साथ एक मैट्रिक्स होना बेहतर है। – Ryan

+4

@Ryan: क्या आपको परवाह है कि यादृच्छिक प्रविष्टियों के किस प्रकार का वितरण है? यदि आप 'बी + बीटी' जोड़ते हैं, तो आपको 0. – unutbu

+0

पर ध्यान केंद्रित एक गैर-वर्दी वितरण मिलेगा, मैं matrices के कुछ गुणों को सत्यापित कर रहा हूं।कुछ गणितीय गुणों के ठोस सबूत प्रदान करने के लिए यह एक और प्रयास है, इसलिए यहां वितरण इतना महत्वपूर्ण नहीं है। हालांकि धन्यवाद! – Ryan

13

मैं बेहतर कर चाहते हैं:

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

क्योंकि इस मामले में एक मैट्रिक्स के सभी तत्वों (इस मामले में वर्दी) एक ही वितरण से कर रहे हैं।

+0

यह वही वितरण रखने का एक बहुत ही शानदार तरीका है! – Arash

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 की वजह से यादृच्छिक परिवर्तनीय उत्पन्न करने के लिए की जरूरत है समरूपता।

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