Как изменить Numpy с (876,) до (876,256,256,3)? - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть numpy массив, который содержит 876 изображений. Каждое изображение размером 256х256х3. Когда я печатаю форму массива, я получаю (876,), где, как я хочу изменить его форму (876,256,256,3).

Когда я пытаюсь использовать arrary.reshape (-1,256,256,3), я сталкиваюсь с ошибками Поговорка не может изменить массив (876,) в (876,256,256,3).

Вот фрагмент кода:

for x in trainList:
    #print(x[0])
    #samples = []
    #samples.append(x[0])
    name = glob.glob("./"+str(TrainFolder)+"/"+x[0])
    img = img_to_array(load_img(name[0], color_mode='rgb', target_size=[im_width,im_height]))
    #samples.append(img)
    #samples.append(x[1])
    temp = [x[0],img,x[1]]    
    trainSet.append(temp)
testList[:] = [os.path.splitext(os.path.basename(x))[0] for x in testList]    
for x in testList:
    #print(x)
    #samples = []
    #samples.append(x)
    #img = cv2.imread("./TestImages/"+x+".jpg")
    #img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    name = glob.glob("./TestImages/"+x+"*")
    img = img_to_array(load_img(name[0], color_mode='rgb', target_size=[im_width,im_height]))
    #samples.append(img) 
    temp = [x,img]    
    testSet.append(temp)
print("Train Data Shape "+str(len(trainSet))) 
print("Test Data Shape "+str(len(testSet)))  

trainSet = np.asarray(trainSet) 
testSet = np.asarray(testSet)
print("Train Data Shape "+str(trainSet.shape))
print("Test Data Shape "+str(testSet.shape))
X_train, X_test, y_train, y_test = train_test_split(trainSet[:,1], trainSet[:,2], test_size=0.33)
print(X_train.shape,y_train.shape)
print(X_test.shape,y_test.shape)

Пожалуйста, посоветуйте решение.

1 Ответ

1 голос
/ 19 апреля 2020

Вы создаете trainSet, добавляя (в список);

temp = [x[0],img,x[1]]    
trainSet.append(temp)

Похоже, x - это некая строка или строки, используемые для создания имен файлов. img - массив, созданный из загрузки изображения. Итак, temp - это список, смесь строк и массива.

trainSet = np.asarray(trainSet) 

Учитывая этот входной список, этот массив обязательно будет массивом типа dd объекта 1d. Он не может создать многомерный массив из этого списка.

testSet - это другой список, но все же смесь строк и массивов:

temp = [x,img]    
testSet.append(temp)

Давайте попробуем воссоздать этот

In [708]: alist = []                                                                                   
In [709]: alist.append(['x0', np.ones((2,3),int), 'x1'])                                               
In [710]: alist.append(['x0', np.ones((2,3),int), 'x1'])                                               
In [711]: alist                                                                                        
Out[711]: 
[['x0', array([[1, 1, 1],
         [1, 1, 1]]), 'x1'], ['x0', array([[1, 1, 1],
         [1, 1, 1]]), 'x1']]
In [712]: np.array(alist)                                                                              
Out[712]: 
array([['x0', array([[1, 1, 1],
       [1, 1, 1]]), 'x1'],
       ['x0', array([[1, 1, 1],
       [1, 1, 1]]), 'x1']], dtype=object)
In [713]: _.shape                                                                                      
Out[713]: (2, 3)

ОК, я ожидал (2,) форму, вместо этого получил (2,3). Поэтому мое чтение вашего кода должно быть отключено.

Я мог бы извлечь часть массива с помощью индексации и stack:

In [718]: np.stack(_712[:,1])                                                                          
Out[718]: 
array([[[1, 1, 1],
        [1, 1, 1]],

       [[1, 1, 1],
        [1, 1, 1]]])
In [719]: _.shape                                                                                      
Out[719]: (2, 2, 3)

В любом случае, мы не можем помочь без дополнительной информации о списках, которые go в np.array(...) звонки. Или хотя бы некоторую информацию о массиве, которую вы пытаетесь изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...