2012-04-14 5 views
2

Ich habe eine NxN-Matrix mit Nullen gefüllt. Jetzt möchte ich der Matrix sagen, n Einsen und m zwei zu zufälligen Orten. I.e. Ich möchte eine Matrix erstellen, wo es eine bestimmte Menge einer gegebenen Zahl an zufälligen Orten und möglicherweise eine feste Menge einer anderen gegebenen Zahl an zufälligen Orten gibt. Wie mache ich das?Matrix mit gegebenen Zahlen in zufälligen Orten in Python/numpy

In Matlab würde ich dies tun, indem Sie eine zufällige Permutation der Matrixindizes mit randperm() machen und dann die n ersten Indizes, die durch randperm der Matrix gegeben sind, mit Einsen und mnächsten mit Zweien füllen.

Antwort

0

Um die Indizes der Elemente zu generieren, wo man Einsen und Zweien hinzufügen kann, was ist damit?

# assuming N, n and m exist. 
In [1]: import random 
In [3]: indices = [(m, n) for m in range(N) for n in range(N)] 
In [4]: random_indices = random.sample(indices, n + m) 
In [5]: ones = random_indices[:n] 
In [6]: twos = random_indices[n:] 

korrigiert, wie durch Petr Viktorin, um nicht kommentiert in ones und twos überlappende Indizes zu haben.

Eine alternative Möglichkeit, die Indizes zu generieren:

In [7]: import itertools 
In [8]: indices = list(itertools.product(range(N), range(N))) 
+0

Dann können sich "Einsen" und "Zweien" überlappen. Besser zu tun '' random_indices = random.sample (Indizes, n + m); ones = random_indices [: n]; twos = random_indices [n:] ''. Beachten Sie, dass dies Pythons [random.sample] (http://docs.python.org/library/random.html#random.sample) ist, was äquivalent zu [numpy.random.choice] (http: //docs.scipy. org/doc/numpy/Referenz/erzeugt/numpy.random.choice.html # numpy.random.choice); [numpy.random.sample] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.sample.html) macht etwas anderes. –

+0

Stimmt, ich habe diese Möglichkeit nicht angesprochen. Vielen Dank. – phant0m

2

wäre numpy.random.permutation, was Sie suchen?

Sie können etwas tun:

In [9]: a=numpy.zeros(100) 

In [10]: p=numpy.random.permutation(100) 

In [11]: a[p[:10]]=1 

In [12]: a[p[10:20]]=2 

In [13]: a.reshape(10,10) 
Out[13]: 
array([[ 0., 1., 0., 0., 0., 2., 0., 1., 0., 0.], 
     [ 0., 0., 1., 0., 0., 0., 0., 0., 2., 0.], 
     [ 0., 2., 0., 0., 0., 0., 2., 0., 0., 1.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 2., 0., 2., 1., 1., 0.], 
     [ 0., 0., 0., 0., 1., 0., 2., 0., 0., 0.], 
     [ 0., 2., 0., 2., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.], 
     [ 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 2., 0., 0., 0., 1., 0.]]) 

Hier haben wir eine zufällige Permutation erstellen, setzen Sie dann die ersten 10 Indizes aus der Permutation in a-1 genommen, dann die nächsten 10 Indizes 2.

3

Sie können numpy.random.shuffle verwenden, um ein Array direkt zu permutieren.

>>> import numpy as np 
>>> X = np.zeros(N * N) 
>>> X[:n] = 1 
>>> X[n:n+m] = 2 
>>> np.random.shuffle(X) 
>>> X = X.reshape((N, N)) 
+2

Möglicher Fehler: Achten Sie darauf, ein eindimensionales Array zu mischen, da [shuffle] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html) nur entlang einer Achse permutiert werden kann . –

Verwandte Themen