не удалось передать входной массив из формы (512,512,100) в форму (512,512)

#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, чтобы построить его