#python #numpy #3d #numpy-ndarray
Вопрос:
Я пытаюсь использовать следующий код для генератора данных для работы с сегментацией дефектов сосудов головного мозга. Я сгенерировал файлы npy для файлов nifiti. каждый npy хранит файлы разных размеров [512,512,140] ,[560,560,141]. Я использую следующий код:
def load_img(img_dir, img_list): images=[] for i, image_name in enumerate(img_list): if (image_name.split('.')[1] == 'npy'): image = np.load(img_dir image_name) images.append(image) images = np.array(images) return(images) def imageLoader(img_dir, img_list, mask_dir, mask_list, batch_size): L = len(img_list) #keras needs the generator infinite, so we will use while true while True: batch_start = 0 batch_end = batch_size while batch_start lt; L: limit = min(batch_end, L) X = load_img(img_dir, img_list[batch_start:limit]) Y = load_img(mask_dir, mask_list[batch_start:limit]) yield (X,Y) #a tuple with two numpy arrays with batch_size samples batch_start = batch_size batch_end = batch_size ############################################ #Test the generator from matplotlib import pyplot as plt import random train_img_dir = "/content/drive/MyDrive/input_data_512/train/images/" train_mask_dir = "/content/drive/MyDrive/input_data_512/train/masks/" train_img_list=os.listdir(train_img_dir) train_mask_list = os.listdir(train_mask_dir) batch_size = 2 train_img_datagen = imageLoader(train_img_dir, train_img_list, train_mask_dir, train_mask_list, batch_size)
Ошибка:
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:13: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray del sys.path[0] --------------------------------------------------------------------------- ValueError Traceback (most recent call last) lt;ipython-input-6-ac15ea7a12c9gt; in lt;modulegt;() 57 58 #Verify generator.... In python 3 next() is renamed as __next__() ---gt; 59 img, msk = train_img_datagen.__next__() 60 61 1 frames lt;ipython-input-6-ac15ea7a12c9gt; in load_img(img_dir, img_list) 11 12 images.append(image) ---gt; 13 images = np.array(images) 14 15 return(images) ValueError: could not broadcast input array from shape (512,512,100) into shape (512,512)
Комментарии:
1. Проверьте
shape
массивы вimages
списке. Они должны отличаться, скорее всего, в конечном измерении.
Ответ №1:
Ваша проблема в линии images = np.array(images)
Входные данные представляют собой список изображений различной формы. Вы пытаетесь преобразовать его в единый многомерный массив. Это не может сработать. Так чего же вы хотите достичь?
Судя по всему, ваш ввод имеет форму (512, 512, 100) и (512, 512). Какую форму вывода вы хотите? Куда должны деваться пиксели? То, что вы сказали numpy сделать, это создать форму (2, 512, 512), но это, очевидно, не работает.
Что вы могли бы сделать, так это создать (512, 512, 101). Если это желательно, замените оскорбительную строку на images = np.dstack(images)
Комментарии:
1. это сработало, спасибо. Однако, когда я пытаюсь построить их, я получаю эту ошибку: слишком много индексов для массива: массив 2-мерный, но 3 были проиндексированы, пожалуйста, проверьте ответ ниже для кода
Ответ №2:
это сработало, спасибо. Однако, когда я пытаюсь построить их, я получаю эту ошибку: слишком много индексов для массива: массив 2-мерный, но 3 были проиндексированы
img, msk = train_img_datagen.__next__() img_num = random.randint(0,img.shape[0]-1) test_img=img[img_num] test_mask=msk[img_num] test_mask=np.argmax(test_mask, axis=2) n_slice=random.randint(0, test_mask.shape[0]) plt.figure(figsize=(12, 8)) plt.subplot(221) plt.imshow(test_img[:,:,n_slice], cmap='gray') plt.title('Image flair') plt.subplot(222) plt.imshow(test_mask[:,:,n_slice],cmap='gray') plt.title('Mask') plt.show()
если я изменю ось на 3, я получу: ось 3 выходит за рамки массива измерения 3
Комментарии:
1. Пожалуйста, не злоупотребляйте механизмом ответа для этого. Просто отредактируйте свой первоначальный вопрос. Что касается вашей проблемы: чего вы хотите достичь с помощью argmax? Кроме того, в строке 3 вы уже выбираете один 2D-срез из всех изображений. Конечно
test_img[:,:,n_slice]
, должен потерпеть неудачу. Ты хотел написатьplt.imshow(img[:,:,n_slice])
2. argmax используется для изменения to_categorical на int, чтобы построить его