0

我在下面有一个二进制 np 数组:

arr = [0. 0. 1. ... 0. 1. 1.]

我想将它写入一个 bin 文件(输出文件名为“test.bin”)。我尝试使用这样的命令:

arr.astype('int8').tofile('test.bin')

但是我发现arr中的每个值都转换为8位。我不想用8位来表示一个数字,因为我需要做NIST sp800-22随机性测试,输入文件必须是bin文件。您能给我一些建议,以便我可以使用 bin 文件中的一位来表示 arr 中的一个数字吗?

谢谢

4

2 回答 2

0

它转换为 int8,因为您使用 .astype('int8') 请求了它。所以把它排除在外,它应该可以按预期工作。

于 2020-07-10T05:33:09.540 回答
0

最小的内存块是字节。所以一般来说,你甚至不应该这样做。但是,如果您坚持,这里有一个技巧:

import struct
with open("test.bnr", "wb") as f:
    for i in range(0,len(arr),8):
        bin_array = struct.pack('Q', int(''.join(arr[i:i+8].astype(str)), base=2))
        f.write(bin_array)

将您的列表转换为长度为 8 字节的字符串,然后将字符串转换为单个无符号双精度并将它们写入文件。这会将其保存为最接近的 8 个字节的倍数。当然,您可以使用其他数据类型(单字节,ints = 4bytes,...)来获得您想要的最接近的倍数。

于 2020-07-10T08:09:35.940 回答