2017-03-13 5 views
1

Ich habe ein ndarray 'n_data' von Schwimmern mit Form (N, 3). Ich möchte Änderungen an 'n_data' vornehmen (keine Kopie). Ich habe den folgenden Code Hexe funktioniert, aber es fühlt sich sehr schmutzig:Korrekter Python Weg zu: Arbeit am Original in for Schleife

i = 0 
    for point in n_data: 
     point -= center 

     r = np.linalg.norm(point) 
     n_data[i] = point * (r ** gamma/r) 

     i += 1 

Ich versuchte np.nditer verwenden, aber für jede Iteration wäre es eine einzige Nummer und keine ndarray mit Form (3,), wie oben zu erhalten .

 for point in np.nditer(n_data, op_flags=['readwrite']): 

     point -= center 

     r = np.linalg.norm(point) 
     point = point * (r ** gamma/r) 

Vielen Dank im Voraus für alle Hilfe!

+0

'nditer' ist generell besser in' c' Code als in Python. Ich würde 'für i, row in enumerate (arr) verwenden:' wenn ich in Zeilen iterieren müsste und auch einen Index benötigt. – hpaulj

Antwort

1

Eine vektorisierte Version der Übersetzung NumPy Begriffe und sieht immer noch nahe genug, um den ursprünglichen Code mit unter Verwendung von NumPy broadcasting und mit den optionalen Argumente axis Parameter mit np.linalg.norm, wie so wäre -

shifted = n_data - center 
R = np.linalg.norm(shifted, axis=1, keepdims=1) 
n_data = shifted * (R ** gamma/R) 

Hoffe, das fühlt sich weniger schmutzig!

+0

Teste deinen Vorschlag und es funktioniert perfekt. Danke für eine gute Antwort, ich werde Broadcasting lesen ;-) – Jake