2014-12-16 12 views
6

Robię trochę pracy, w której muszę załadować manipulować obrazy CT w formacie o nazwie Analyze 7.5 file format.Ładowanie Analiz obrazów w formacie 7.5 w python

Częścią tej manipulacji - która zajmuje absolutnie wiek z dużymi obrazami - jest ładowanie nieprzetworzonych danych binarnych do tablicy numpy i przekształcanie jej na właściwe wymiary. Oto przykład:

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 

wiem numpy można zrobić dopasowania kształtu tablic szybko, ale nie mogę dowiedzieć się prawidłową kombinację przekształceń niezbędnych do replikacji efekt zagnieżdżonych pętli.

Czy istnieje sposób na skopiowanie tego dziwnego indeksowania za pomocą kombinacji numpy.reshape/numpy.ravel itp?

Odpowiedz

0

Można użyć przekształcenia w kombinacji z swapaxes

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

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

pracował dobrze w moim przypadku.

+0

Dokładnie kod, którego szukałem, dzięki! – Theolodus

0

przechowuje tablice płaskie w pamięci. Atrybut strides zawiera informacje niezbędne do odwzorowania wielowymiarowych indeksów na płaskie wskaźniki w pamięci.

Here to kolejne czytanie o układzie pamięci w formacie numpy.

ten powinien pracować dla Ciebie:

# 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() 

Kod wykorzystuje ustawienie atrybutu strides do zastanowienia niestandardowego mapowania pamięci oraz stworzyć (mam nadzieję) prawidłową tablicę wielowymiarową. Następnie kopiuje całą tablicę do data, aby powrócić do standardowego układu pamięci.

+0

Dzięki za linki. Od czasu do czasu muszę komunikować się z MATLAB/Octave, więc wiedząc, że robią rzeczy w fortranowym układzie, jest to przydatne! – Theolodus

0

Zapoznaj się z nibabel, biblioteką pytonów, która implementuje czytniki/programy piszące w formacie "Analizuj". Być może już to rozwiązało.

+0

Dzięki za wskazówkę - nibabel wygląda całkiem fajnie. Mam do czynienia z innymi formatami, więc może to być droga ... – Theolodus

Powiązane problemy