2014-12-16 11 views
6

ich einige Arbeit machte wobei ich laden muß ein CT-Bilder in einem Format, das Analyze 7.5 file format genannt manipulieren.Laden Analysieren 7.5-Format Bilder in Python

Ein Teil dieser Manipulation - die absolut Alter mit großen Bildern nimmt - wird die rohen Binärdaten zu einem numpy Array geladen und es auf die richtigen Dimensionen Umformung. Hier ein Beispiel:

headshape = (512,512,245) # The shape the image should be 
headdata = np.fromfile("Analyze_CT_Head.img", dtype=np.int16) # loads the image as a flat array, 64225280 long. For testing, a large array of random numbers would do 

head_shaped = np.zeros(shape=headshape) # Array to hold the reshaped data 

# This set of loops is the problem 
for ux in range(0, headshape[0]): 
    for uy in range(0, headshape[1]): 
     for uz in range(0, headshape[2]): 
      head_shaped[ux][uy][uz] = headdata[ux + headshape[0]*uy + (headshape[0]*headshape[1])*uz] # Note the weird indexing of the flat array - this is the pixel ordering I have to work with 

Ich weiß numpy Umbildung von Arrays schnell tun können, aber ich kann nicht die richtige Kombination von Transformationen erforderlich herauszufinden, um die Wirkung der verschachtelten Schleifen zu replizieren.

Gibt es eine Möglichkeit, dass die seltsame Indizierung mit einer Kombination aus numpy.reshape/numpy.ravel etc zu replizieren?

Antwort

0

könnten Sie verwenden Kombination umformen mit swapaxes

headshape = (2,3,4) 
headdata = rand(2*3*4) 

head_shaped_short = headdata.reshape(headshape[::-1]).swapaxes(0,2) 

in meinem Fall gut funktioniert.

+0

Genau der Code, den ich suchte, danke! – Theolodus

0

numpy speichert Arrays in dem Speicher flach. Das Attribut strides enthält die erforderlichen Informationen zum Zuordnen multidimensionaler Indizes zu den flachen Indizes im Speicher.

Here ist etwas weiter über numpy ‚s Speicher-Layout zu lesen.

Dies sollte für Sie arbeiten:

# get the number of bytes of the specified dtype 
dtype = headdata.dtype 
byte_count = dtype.itemsize 

headdata = headdata.reshape(headshape) 
x, y, z = headshape 
headdata.strides = (byte_count, byte_count * x, byte_count * x * y) 

# copy data to get back to standard memory layout 
data = headdata.copy() 

Der Code nutzt die Einstellung der strides Attribut Ihrer benutzerdefinierten Speicherzuordnung zu reflektieren und die (hoffentlich) richtig mehrdimensionales Array zu erstellen. Danach kopiert es das gesamte Array in data, um zu einem Standardspeicherlayout zurückzukehren.

+0

Danke für die Links. Ich muss gelegentlich mit MATLAB/Octave interagieren, daher ist es praktisch, wenn Sie wissen, dass Sie etwas im Fortran-Layout machen. – Theolodus

0

Werfen Sie einen Blick auf die nibabel, eine Python-Bibliothek, die Leser/Schreiber für das "Analyse" -Format implementiert. Vielleicht hat es das schon für dich gelöst.

+0

Danke für den Tipp - Nibabel sieht ziemlich cool aus. Ich muss mich mit anderen Formaten beschäftigen, also könnte das der richtige Weg sein ... – Theolodus