2016-12-31 1 views
2

ich von einem MATLAB Hintergrund kommen und ich versuche, dies in Python zu schreiben/numpy:Python3/Numpy: ndarray bedingte Indexierung

[l, m, n] = ndgrid(1:size(dct, 1), 1:size(dct, 2), 1:size(dct, 3)); 
mycell{i, j} = dct(... 
    min.^2 <= l.^2 + m.^2 + n.^2 & ... 
    l.^2 + m.^2 + n.^2 <= max.^2)'; 

Also, was der Code soll bis zu ist nehmen die ganze Werte des Arrays, der einen Index (zB x, y, z), die eine 2-Norm zwischen min und max, dh min^2 < x^2 + y^2 + z^2 < max^2

Das einzige, was ich mit einem Zustand betrug etwa Indexieren einige Werte eines Arrays finden konnten des Werts des Arrays an diesem Index, jedoch möchte ich mit einer Bedingung auf dem Index selbst indizieren.

Ich lese über Rundfunk und die ix_ Funktion und erweiterte Indexierung, aber ich kann nicht die Stücke zusammenpassen.

+0

@Divakar bearbeitet die Frage klarer zu machen. – Xaser

+0

Als eine gute Übung, wäre es nett, Namen wie 'min',' max' zu vermeiden, die bereits Namen für eingebaute sind. – Divakar

Antwort

5

NumPy bietet uns an, offene Netze zu erstellen, die die 3D-Netze mit Hilfe von np.ogrid ersetzen können. Dies würde im Wesentlichen den ndgrid Teil von MATLAB Code ersetzen, aber mit zusätzlichen Vorteilen (lesen Sie für weitere Details). Diese Netze könnten dann quadriert und hinzugefügt werden, um das Äquivalent von l.^2 + m.^2 + n.^2 durchzuführen, ohne tatsächlich Versionen von l, m und n zu erzeugen, wie wir es mit ndgrid gemacht hatten. Dies ist ein riesiges Leistungskriterium und wurde in this previous post untersucht und es hat Leistungsvorteile gezeigt.

So zu NumPy Portierung über, hätten wir -

m,n,r = dct.shape  
x,y,z = np.ogrid[0:m,0:n,0:r] 
vals = x**2+y**2+z**2 
mycell[i][j] = dct[(min**2 <= vals) & (vals <= max**2)]