将列表写入二进制文件时出现问题

时间:2017-07-19 23:20:34

标签: python numpy

我有一个大小为(n*n)的矩阵X,我想将其写入两个单独的二进制文件(即,满足条件的n / 2行必须转到文件,剩下的转到另一个) 。我把它写成以下代码:

def write_to_binary_file(X, y):
    posiResponse = []
    negaResponse = []
    for idx, res in enumerate(y):
        if res == 1:
            posiResponse.extend(X[idx])
        else:
            negaResponse.extend(X[idx])

    with open("POS.bin", mode='wb') as file1:
        file1.write(bytearray(posiResponse))
    file1.close()
    with open("NEG.bin", mode='wb') as file2:
        file2.write(bytearray(negaResponse))
    file2.close()

我收到一个错误,抱怨数组以及我如何使用bytearray(),但我不知道如何调整它:

Traceback (most recent call last):
  File "exper.py", line 173, in <module>
    write_data(X, y)
  File "exper.py.py", line 47, in write_data
    file1.write(bytearray(posiResponse))
TypeError: an integer or string of size 1 is required

请说,有人可以提供一个好的解决方案吗?谢谢。

2 个答案:

答案 0 :(得分:1)

posiResponsenegaResponse是列表。 Numpy有一些方法可以让你轻松写入文件。这是使用np.ndarray.tofile的一种方式:

def write_to_binary_file(X, y):
    ... # populate posiResponse and negaResponse here

    np.array(posiResponse).tofile('POS.bin')
    np.array(negaResponse).tofile('NEG.bin')

或者,您可以将这些数据结构保留为列表,然后使用pickle模块中的pickle.dump转储数据:

import pickle
def write_to_binary_file(X, y):
    ... # populate posiResponse and negaResponse here

    pickle.dump(posiResponse, open('POS.bin', 'wb'))
    pickle.dump(negaResponse, open('NEG.bin', 'wb'))

答案 1 :(得分:0)

除了@ COLDSPEED的回答,您可以使用numpy.save

def write_to_binary_file(X, y):
    posiResponse = []
    negaResponse = []
    for idx, res in enumerate(y):
        if res == 1:
            posiResponse.extend(X[idx])
        else:
            negaResponse.extend(X[idx])
    np.save('POS', posiResponse)
    np.save('NEG', negaResponse)

不幸的是,它会添加扩展程序npy

稍后,您可以将列表加载为:

posiResponse = np.load('POS.npy').tolist()