无法从Python 3.x中的文件读取二进制矩阵

时间:2019-03-23 04:25:30

标签: python-3.x numpy numpy-ndarray

因此,我必须执行这两个功能,一个功能是将二进制矩阵保存在.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 :(得分:0)

两次创建一个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不起作用。它将输入变成2d数组,并在第一轴上将它们连接起来:

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,)和(1,3)以及(4,3)连接时起作用。请注意常见的“最后”尺寸。

潜在的问题是您试图模拟列表追加,而没有完全理解维度或concatenate的作用。每次都会创建一个全新的数组。 np.append不是list.append!的副本!。

您应该做的是从一个[]列表(或两个)开始,向其添加新值,以创建一个列表列表。然后np.array(alist)将其转换为数组(当然,所有子列表的大小都应匹配)。

我没有关注您的写作或如何阅读台词,因此无法说出这是否有意义。