2016-11-20 2 views
0

Hallo meine Frage ist in Bezug auf den J. F. Sebastian Code und Diskussion unten. Ich versuche, ein Unterfeld eines Arrays zu drucken. Der Code ist unten und mein Update ist auf der Unterseite. (Es gibt Fehlermeldungen) creating a spiral array in python?Extraktion Sub-Array des Arrays

Ich möchte ein Sub-Array basierend auf einem ausgewählten Eintrag in diesem Array erstellen. wenn wir den 04 Eintrag wählen,

subarray[x][y] == 04 
subarray[x][y] == TheSpiral[x-1:x+2,y-1:y+2] 

print_matrix(TheSpiral) 
print_matrix(subarray) 

Allerdings erhalte ich eine Fehlermeldung wegen nicht ordnungsgemäß Subarray definieren. Ich erwartete das print_matrix (Subarray)

06 01 02 
05 04 03 
16 15 14 

zu ergeben, weshalb ich #TheSpiral verwendet [X-1: x + 2, y-1 y + 2]. Danke für die Hilfe.

+2

** 'Ich bekomme Fehlermeldungen' ** ist kaum eine gute Beschreibung des Problems. Was sind Ihre Fehlermeldungen? Könnten Sie bitte genauer sein? –

Antwort

2

Das Problem ist, dass die zweite Scheibe nicht tun, was Sie denken, es tut

  • es ist ein Syntaxfehler mit Standardliste und Sie sollten [][] jedoch verwenden ...
  • die zweiten Indizes der einzelnen Subarrays nicht schneiden, gibt eine Scheibe, die Liste der Listen, die die zweite Scheibe auch auf

arbeiten würden Sie können es mit einer Liste Verständnis beheben:

>>> i, j = 3, 2 
>>> subarray = [row[j-1:j+2] for row in TheSpiral[i-1:i+2]] 
>>> print_matrix(subarray) 
06 01 02 
05 04 03 
16 15 14 

Sie Alternativ können numpy (was vielleicht übertrieben !!!) und die Original-Syntax verwenden:

>>> import numpy as np 
>>> subarray = np.array(TheSpiral)[i-1:i+2,j-1:j+2] 
>>> print_matrix(subarray) 
06 01 02 
05 04 03 
16 15 14 

die Spirale berechnen Koordinaten:

def spiral_coord(n): 
    k = int((n**0.5) // 2) 
    t = 2*k 
    m = (t+1)**2 
    for fn in (lambda: (-k, k-(m-n)), lambda: (-k+(m-n), -k), lambda: (k, -k+(m-n))): 
     if n >= m-t: 
      return fn() 
     m -= t 
    return k-(m-n-t), k 

>>> mid = (5-1)//2 
>>> i, j = map(lambda x: x+mid, spiral_coord(9)) 
>>> subarray = np.array(TheSpiral)[i-1:i+2,j-1:j+2] 
>>> print_matrix(subarray) 
23 24 25 
08 09 10 
01 02 11 
1

Ich glaube, dass es einen syntaktischen Fehler in Ihrem Subarray-Code gibt. Da das Verfahren „Spirale“ ein 2D-Array (spiral in Ihrem Fall) zurückgibt, die Art und Weise die Elemente des 2D-Arrays für den Zugriff muss

TheSpiral[i][j] 

nicht

TheSpiral[i,j]