Elemente in Matrizen einfügen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
st.aquila
User
Beiträge: 2
Registriert: Samstag 28. April 2012, 16:10

Hallo,

bin neu hier und hoffe, dass man mir helfen kann. Ich hab soll mit einem Pythonprogramm das folgende Problem lösen:
In einer Gruppe von 8 Leuten kriegt einer die Änderung der gestellten Hausaufgabe mit. Er und jeder andere darf die Information nur an zwei weitere geben. Wie viele Schritte braucht es, bis alle die Information erhalten haben.

Das Problem soll mit Matrizenrechnung gelöst werden. Zunächst soll das Schülernetzwerk als eine zufällige Matrix mit out-degree "2" pro spalte formuliert werden. Ich habe den Tipp bekommen, dafür erst eine Nullmatrix der gewünschten Größe zu machen (8x8). Und dann mit numpy.randint(7, size = (8,2)) einen array aus 8 arrays mit je 2 Elementen zufällig generieren zu lassen. Das wären dann meine Koordinaten, die ich dann in der Nullmatrix in eine 1 umwandeln könnte.

Ich weiß, dass ich die "1" mit Nullmatrix[a,b] = 1 einfügen kann, also wenn ich die Koordinaten manuel aus dem Zufallsarray auswähle. Ich will bzw. muss es aber eine Schleife machen, d.h ich muss irgend eine verallgemeinernde Zeile schreiben, die ein array nach dem anderen aus dem Zufallsarray nimmt und es als Koordinaten der Nullmatrix gleich "1" setzt. Das kriege ich nicht hin. Es könnte an klammern liegen, aber ich hab schon alles ausprobiert. Kann mir da jemand helfen?
BlackJack

@st.aquila: Wenn Du schon `numpy` verwendest, dann möchtest Du sicher keine Schleifen in Python schreiben, welche die 1en einzeln eine nach der anderen zuweist. Nutze Arrays auch wenn Du sie schon hast. Der Index muss nicht nur aus einzelnen Koordinaten bestehen. Man kann dafür auch Arrays verwenden um mehr als einen Wert anzusprechen. Und dann ist ein 2×8-Array mit Zufallszahlen einfacher zu handhaben:

Code: Alles auswählen

In [321]: a = np.zeros((8, 8), dtype=np.int8)

In [322]: b = np.random.randint(7, size=(2, 8))

In [323]: b
Out[323]: 
array([[4, 6, 6, 4, 2, 6, 1, 4],
       [6, 4, 1, 2, 5, 0, 3, 3]])

In [324]: a
Out[324]: 
array([[0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0]], dtype=int8)

In [325]: a[tuple(b)] = 1

In [326]: a
Out[326]: 
array([[0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0]], dtype=int8)
Ich sehe aber nicht wie das sinnvoll für die Aufgabe ist!? Was bedeuten diese acht Einsen in der Matrix denn jetzt? Wofür stehen die?

Wie ist die Aufgabe denn genau spezifiziert? Es wäre ja beispielsweise unsinnig wenn eine Person sich die Information selbst erzählen würde. Oder an eine andere Person weitergeben würde von der sie die Information in der Vergangenheit schon einmal bekommen hat. So dumm sind Schüler nicht. ;-)
st.aquila
User
Beiträge: 2
Registriert: Samstag 28. April 2012, 16:10

Hallo,

danke für die Antwort erstmal. Aber leider hilft es mir nicht, weil ich wirklich 2 Einsen pro Spalte brauche, jedesmal zufällig in der Spalte angeordnet. Im Bezug auf das Schülernetzwerk bedeutet das, wenn jede Spalte für einen Schüler steht, dass der zu zwei Leuten spricht. Das war ja die Bedingung, übrigens auch die einzige. Alles andere ist erlaubt, wie zu sich selbst sprechen und Leuten, die schon wissen wiederholt Bescheid sagen. Es geht nur darum, in wie vielen Schleifen alle Schüler informiert sind.
BlackJack

@st.aquila: Ich habe Dir eine Lösung zu Deiner Frage gegeben. Wenn Dir das nicht hilft weil Du eigentlich was anderes haben willst, hättest Du halt die Frage anders stellen müssen. ;-)

Wenn Du zwingend zwei Einsen pro Spalte brauchst, dann ist das mit der Zufallszahlengenerierung nicht einfach mit `numpy.random.randint()` getan, denn da könnte ja auch zufällig zweimal der gleiche Wert für eine Spalte ”gewürfelt” werden. Oder ist das auch egal? Dann ginge das hier:

Code: Alles auswählen

In [385]: a = np.zeros((8, 8), dtype=np.int8)

In [386]: b = np.tile(np.arange(8), 2)

In [387]: c = np.random.randint(7, size=16)

In [388]: a
Out[388]: 
array([[0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0]], dtype=int8)

In [389]: b
Out[389]: array([0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7])

In [390]: c
Out[390]: array([1, 2, 5, 5, 3, 4, 1, 6, 0, 3, 0, 2, 5, 2, 1, 1])

In [391]: a[c, b] = 1

In [392]: a
Out[392]: 
array([[1, 0, 1, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 1, 1],
       [0, 1, 0, 1, 0, 1, 0, 0],
       [0, 1, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 0, 0, 0]], dtype=int8)
Antworten