Преобразовать список в массив Numpy, потеряв две из трех его осей только с одним набором данных - PullRequest
0 голосов
/ 04 марта 2020

У меня есть python код, который читает изображения NIFTI с использованием библиотеки SimpleITK. Затем он преобразует эти изображения в массив Numpy. Затем я расширяю массив Numpy в список.

У меня есть 20 файлов FLAIR.nii.gz. Каждый из них имеет 48 срезов.

Когда у меня есть все 48 срезов всех 20 пациентов, я преобразую список в массив Numpy.

Я делаю это таким образом, потому что я Я новичок ie с Python, и я не знаю другого способа сделать это.

Код:

import os
import SimpleITK as sitk
import numpy as np

flair_dataset = []

# For each patient directory
# data_path is a list with all of the patient's directory.
for i in data_path:

    img_path = os.path.join(file_path, i, 'pre')
    mask_path = os.path.join(file_path, i)

    for name in glob.glob(img_path+'/FLAIR*'):
        # Reads images using SimpleITK.
        brain_image = sitk.ReadImage(name)
        # Get a numpy array from a SimpleITK Image.
        brain_array = sitk.GetArrayFromImage(brain_image)

        flair_dataset.extend(brain_array)

        if debug:
            print('brain_image size: ', brain_image.GetSize())
            print('brain_array Shape: ', brain_array.shape)
            print('flair_dataset length:', len(flair_dataset))

print('flair_dataset length: ', len(flair_dataset))
print('flair_dataset[1] type: ', print(type(flair_dataset[1])))
print('flair_dataset[1] shape: ', print(flair_dataset[1].shape))

flair_array = np.array(flair_dataset)
print('flair_array.shape: ', flair_array.shape)
print('flair_array.dtype: ', flair_array.dtype)

Этот код генерирует этот вывод (все FLAIR Файлы .nii.gz имеют одинаковую форму):

data_path =  ['68', '55', '50', '61', '63', '52', '51', '60', '67', '58', '59', '53', '69', '64', '56', '65', '54', '62', '66', '57']
patient_data_path =  68
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 48
Mask list length:  48

patient_data_path =  55
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 96
Mask list length:  96

patient_data_path =  50
brain_image size:  (256, 232, 48)
brain_array Shape:  (48, 232, 256)
flair_dataset length: 144
WMH image Size:  (256, 232, 48)
WMH array Shape:  (48, 232, 256)
Mask list length:  144

patient_data_path =  61
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 192
Mask list length:  192

patient_data_path =  63
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 240
Mask list length:  240

patient_data_path =  52
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 288
Mask list length:  288

patient_data_path =  51
brain_image size:  (256, 232, 48)
brain_array Shape:  (48, 232, 256)
flair_dataset length: 336
WMH image Size:  (256, 232, 48)
WMH array Shape:  (48, 232, 256)
Mask list length:  336

patient_data_path =  60
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 384
Mask list length:  384

patient_data_path =  67
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 432
Mask list length:  432

patient_data_path =  58
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 480
Mask list length:  480

patient_data_path =  59
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 528
Mask list length:  528

patient_data_path =  53
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 576
Mask list length:  576

patient_data_path =  69
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 624
Mask list length:  624

patient_data_path =  64
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 672
Mask list length:  672

patient_data_path =  56
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 720
Mask list length:  720

patient_data_path =  65
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 768
Mask list length:  768

patient_data_path =  54
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 816
Mask list length:  816

patient_data_path =  62
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 864
Mask list length:  864

patient_data_path =  66
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 912
Mask list length:  912

patient_data_path =  57
brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)
flair_dataset length: 960
Mask list length:  960

Окончательный вывод кода:

flair_dataset length:  960
mask_dataset length:  960
flair_dataset[1] type:  <class 'numpy.ndarray'>
flair_dataset[1] shape:  (256, 232)
flair_array.shape:  (960,)
flair_array.dtype:  object

Моя проблема:

Не знаю понять, почему flair_array имеет такую ​​форму: (960,). flair_array dtype - это object.

Я попробовал тот же код, ничего не меняя, и он отлично работает. Он также имеет 20 пациентов и 48 срезов для каждого файла FLAIR.nii.gz.

Его вывод:

data_path =  ['39', '31', '2', '23', '35', '29', '17', '49', '27', '8', '33', '4', '19', '41', '37', '11', '25', '6', '0', '21']

patient_data_path =  39
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 48
Mask list length:  48

patient_data_path =  31
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 96
Mask list length:  96

patient_data_path =  2
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 144
Mask list length:  144

patient_data_path =  23
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 192
Mask list length:  192

patient_data_path =  35
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 240
Mask list length:  240

patient_data_path =  29
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 288
Mask list length:  288

patient_data_path =  17
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 336
Mask list length:  336

patient_data_path =  49
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 384
Mask list length:  384

patient_data_path =  27
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 432
Mask list length:  432

patient_data_path =  8
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 480
Mask list length:  480

patient_data_path =  33
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 528
Mask list length:  528

patient_data_path =  4
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 576
Mask list length:  576

patient_data_path =  19
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 624
Mask list length:  624

patient_data_path =  41
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 672
Mask list length:  672

patient_data_path =  37
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 720
Mask list length:  720

patient_data_path =  11
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 768
Mask list length:  768

patient_data_path =  25
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 816
Mask list length:  816

patient_data_path =  6
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 864
Mask list length:  864

patient_data_path =  0
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 912
Mask list length:  912

patient_data_path =  21
brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)
flair_dataset length: 960
Mask list length:  960

Это окончательный вывод для этого набора данных:

flair_dataset length:  960
mask_dataset length:  960
flair_dataset[1] type:  <class 'numpy.ndarray'>
flair_dataset[1] shape:  (240, 240)
flair_array.shape:  (960, 240, 240)
flair_array.dtype:  float32

С этим вторым набором данных flair_array равен float32.

Почему первая flair_array форма (960,)?

ОБНОВЛЕНИЕ: В обоих наборах данных brain_array.dtype всегда равно float32.

Ответы [ 2 ]

3 голосов
/ 04 марта 2020

В одном случае

flair_array.shape:  (960,)
flair_array.dtype:  object

в другом

flair_array.shape:  (960, 240, 240)
flair_array.dtype:  float32

Вы делаете это с помощью:

flair_array = np.array(flair_dataset)

Если все элементы flair_dataset имеют той же формы, он может создать из них многомерный массив.

Но если один или несколько массивов в списке отличаются по форме, он должен отказаться от многомерной цели, а вместо этого просто делает объект Массив dtype, который очень похож на список, содержит ссылки на исходные массивы.

В исходном списке большинство элементов

brain_image size:  (232, 256, 48)
brain_array Shape:  (48, 256, 232)

, но я также вижу некоторые

brain_image size:  (256, 232, 48)
brain_array Shape:  (48, 232, 256)

Во втором наборе все они

brain_image size:  (240, 240, 48)
brain_array Shape:  (48, 240, 240)

Когда люди спрашивают о (n,) форме, когда они ожидают (n, m, p), я подозреваю, что у первого есть object dtype, вызванный смешением форм элементов. Вот почему я спросил о dtype.

1 голос
/ 04 марта 2020

Я думаю, что flair_dataset.extend(brain_array) просто расширяет список flair_dataset загруженным массивом. Так что в flair_dataset имеется массив со всеми 960 сложенными изображениями. Каждое изображение имеет размер 240, 240.

Загружаете ли вы изображения в пакетном режиме или на изображении содержится глубина 48 слоев? Если это так, попробуйте добавить массив, а не расширять его. Затем вы помещаете загруженный массив в запись списка.

...