Не могу прочитать двоичную матрицу из файла в Python 3.x - PullRequest
0 голосов
/ 23 марта 2019

Итак, мне нужно выполнить эти две функции: одну, которая сохраняет двоичную матрицу в .bin-файле, и одну, которая читает тот же файл и возвращает numpy.array.

Моя проблема в том, что когда я пытаюсь .vstack как строки, так и конечного изображения (я в основном хочу сохранить черно-белое изображение), я получаю это сообщение об ошибке:

'ValueError: все размеры входного массива, кроме оси конкатенации, должны точно совпадать'

, что имеет смысл, потому что после того, как я прочитал вторую строку, binaryLine и конечное изображение имеют различную длину, по какой-то причине я не могу понять.

def save_binary_matrix(img, fileName):
    file = open(fileName, "w+")
    heigth, width = img.shape
    image = convert_BW_to_0_1(img) # converts from 0 and 255 to 0 and 1
    for y in range(heigth):
        for x in range(0, width, 8):
            bits = image[y][x:x+8]# gets every 8 bits
            s = ''
            # converts bits to a string
            for i in range(len(bits)):
                s = s + str(bits[i])
            file.write(str(int(s,2)))# saves the string as a integer
        file.write("\n")# line change
    file.close()

def read_binary_matrix(fileName):
    file = open(fileName, "r")
    #saves first line of the file
    finalImage = np.array([])
    line = file.readline()
    for l in range(len(line)):
        if line[l] != '\n':
            finalImage = np.append(finalImage, np.array([int(x) for x in list('{0:08b}'.format(int(line[l])))]))
    #reads and saves other lines
    for line in file:
        binaryLine = np.array([])
        for l in range(len(line)):
            if line[l] != '\n':
                #read and saves line as binary value
                binaryLine = np.append(binaryLine, np.array([int(x) for x in list('{0:08b}'.format(int(line[l])))]))
            finalImage = np.vstack((finalImage, binaryLine))
    return finalImage

1 Ответ

0 голосов
/ 23 марта 2019

Дважды вы создаете np.array([]).Обратите внимание на его форму:

In [140]: x = np.array([])                                                      
In [141]: x.shape                                                               
Out[141]: (0,)

Он работает в np.append - потому что без параметра оси append это просто concatenate((x, y), axis=0), например, добавление формы (0,) и (3,), чтобы создать (3,) форму:

In [142]: np.append(x, np.arange(3))                                            
Out[142]: array([0., 1., 2.])

Но vstack не работает.Он вводит свои входные данные в двумерные массивы и объединяет их на первой оси:

In [143]: np.vstack((x, np.arange(3)))                                          
ValueError: all the input array dimensions except for the concatenation axis must match exactly

Таким образом, мы объединяем (0,) и (3,) на новой первой оси, например (1,0)и (1,3) на первой оси.0 и 3 не совпадают, поэтому ошибка.

vstack работает при соединении (3,) с (3,) и a (1,3) и a (4,3).Обратите внимание на общее «последнее» измерение.

Основная проблема заключается в том, что вы пытаетесь эмулировать добавление в список без полного понимания измерений или того, что делает concatenate.Каждый раз создается новый массив.np.append не является клоном list.append!.

Что вы должны сделать, это начать со списка [] (или двух), добавить к нему новые значения, составив список списков.Затем np.array(alist), чтобы превратить это в массив (при условии, конечно, что все подсписки совпадают по размеру).

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

...