2013-12-20 21 views
6

Wie können Sie iterieren über alle 2^(n^2) binäre n durch n Matrizen (oder 2d Arrays) in numpy? Ich würde so etwas wie:Iterieren über Matrizen in numpy

for M in ....: 

Haben Sie itertools.product([0,1], repeat = n**2) verwenden und dann zu einem 2d numpy Array zu konvertieren?

Dieser Code wird mir eine zufällige 2d binäre Matrix geben, aber das ist nicht was ich brauche.

np.random.randint(2, size=(n,n)) 
+1

Was Sie zu tun versuchen werden? Numpy ist vektorisiert, so dass Sie für viele Operationen nicht explizit iterieren müssen. – MattDMo

+0

@MattDMo Ich möchte einen Test für jede 2d binary n by n Matrix ausführen. n wird sehr klein sein, also sollte dies machbar sein. – marshall

+0

Wie groß kann n sein? kennen Sie 2 ** (n ** 2) Wachstumsrate? – alko

Antwort

4

Beachten Sie, dass 2**(n**2) ist eine große Zahl für noch relativ kleine n, so dass Ihre Schleife könnte indefinetely lang laufen.

gesagt, dass ein möglicher Weg, Matrizen Sie iterieren müssen zum Beispiel ist

nxn = np.arange(n**2).reshape(n, -1) 
for i in xrange(0, 2**(n**2)): 
    arr = (i >> nxn) % 2 
    # do smthng with arr 
+0

Schön! Es ist wahrscheinlich schneller, '& 1' statt'% 2' zu tun. Wenn 'nxn' ein Vielfaches von 8 ist, kann es auch schneller sein, [' np.unpackbits'] aufzurufen (http://docs.scipy.org/doc/numpy/reference/generated/numpy.unpackbits.html). . – Jaime

2
np.array(list(itertools.product([0,1], repeat = n**2))).reshape(-1,n,n) 

erzeugt ein (2^(n^2),n,n) Array.

Es kann einige numpy "Raster" -Funktion, die das gleiche tut, aber meine Erinnerung aus anderen Diskussionen ist, dass itertools.product ist ziemlich schnell.

g=(np.array(x).reshape(n,n) for x in itertools.product([0,1], repeat = n**2)) 

ist ein Generator, der die nxn-Arrays eine zur Zeit produziert:

g.next() 
# array([[0, 0],[0, 0]]) 

Oder die gleiche 3D-Array zu erzeugen:

np.array(list(g))