2017-01-28 2 views
1

Ich habe ein Stück Code in MATLAB, und ich versuche, diesen Code in Python zu übersetzen. In MATLAB kann ich dies schreiben:Wie verwende ich einen linearen Index für den Zugriff auf ein 2D-Array in Python

x = [1,2,3;4,5,6;7,8,9]; 

das ist nur eine 3 * 3-Matrix. Dann, wenn ich x(1:5) verwende, überträgt MATLAB zuerst die Matrix x in einen 1 * 9 Vektor und gibt mir dann einen 1 * 5 Vektor wie folgt zurück: Also könntest du mir bitte sagen, was für ein Stück Code in Python das haben kann gleiches ergebnis?

+0

neue Absätze werden von Putten erstellt ng eine leere Zeile zwischen dem Ende eines Absatzes und dem Anfang eines nächsten. Also zwei Antworten – user2386276

+1

Nicht genau, wie MATLAB funktioniert. 'x (1: 5)' nimmt einfach die ersten fünf Elemente in der Reihenfolge der Spalten, wie Sie es beschrieben haben, aber MATLAB macht keinen Zwischenschritt. – Adriaan

+0

Zuerst, danke, dass Sie mir wissen lassen, wie man einen neuen Absatz generiert. Unter Berücksichtigung der Matlab-Prozeduren versuche ich dann zu beschreiben, was Matlab zurückgibt und hoffe, die Antwort über die richtige Aussage zu erhalten, um die gleiche Arbeit in Python zu leisten. Trotzdem danke für deine Meinung. –

Antwort

5

Sie können Ihre Matrix auf eine numpy Array umwandeln und dann unravel_index verwenden Ihre linearen Indizes in Indizes zu konvertieren, die Sie dann auf Index in Ihre ursprüngliche Matrix verwenden können. Beachten Sie, dass alle folgenden Befehle verwenden, um die 'F' Eingabespalte-Haupt Ordnung (die Standardeinstellung für MATLAB) und nicht zeilenweise Anordnung (die Standardeinstellung für numpy)

import numpy as np 

a = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
inds = np.arange(5); 

result = a[np.unravel_index(inds, a.shape, 'F')] 
# array([1, 4, 7, 2, 5]) 

auch zu verwenden, wenn Sie eine Matrix glätten wollen wie MATLAB können Sie das tun auch:

a.flatten('F') 
# array([1, 4, 7, 2, 5, 8, 3, 6, 9]) 

Wenn Sie eine Reihe von MATLAB-Code zu python konvertieren, es ist stark empfohlen numpy zu bedienen und buchen the documentation on notable differences

+0

Ich schätze deine Hilfe sehr. Dein Code löst perfekt das Problem, das ich habe. Und danke für die Dokumentation. –

1

Ich bin mir nicht sicher, was Matlabs x(1:5) Syntax tun soll, aber je nach Ihrer gewünschten Ausgabe würde es scheinen, die Matrix zu transponieren, es flach zu machen und dann ein Stück zurückzugeben. Dies ist, wie das in Python zu tun:

>>> from itertools import chain 
>>> 
>>> x = [[1,2,3], 
...  [4,5,6], 
...  [7,8,9]] 
>>> 
>>> list(chain(*zip(*x)))[0:5] 
[1, 4, 7, 2, 5] 
+0

Ich habe kommentiert, was MATLAB macht: es gibt die Matrix in der Reihenfolge der Spalten zurück. I.e. wenn 'A = [1,2; 3,4]' 'A (:)' würde [1; 2; 3; 4] 'zurückgeben. Keine Umsetzung involviert, einfach nur alte Kolumnenordnung. Was Sie als "Abflachung" bezeichnen, ist anscheinend das, was Python tut, das ist die gleiche Prozedur, aber in der Reihenfolge der Zeilen, also ja, dann müssten Sie eine Matrix transponieren, um das gleiche in der Spaltenmajor zu erhalten. – Adriaan

+0

Ihr Code kann die Frage perfekt beantworten! Aber das Problem, das ich habe, ist komplizierter. Auch thx für Ihre Antwort! –

Verwandte Themen