如何使用 Numpy 读取具有二进制值的文本文件,其中每一行本身就是一个二进制向量?



这个想法是文本文件有 150 行,其中每行是 1024 位的字符串(32x32 图像的表示形式(。

我想要实现的是拥有一个包含 150 个元素的数组,其中每个元素都是大小为 1024 的数组。

通过尝试下面的代码,我得到了一个包含 150 个元素的数组,具有 inf 值。 有没有办法直接使用 numpy 的 loadtxt 将这些值转换为向量。

提前谢谢你!

import numpy as np
data = np.loadtxt("digits.txt")

如果每行的长度完全相同,并且只包含字符01,则可以使用numpy.genfromtxtdelimiter=1。 当参数delimiter是单个整数时,genfromtxt将每一行视为固定宽度字段序列。 提供给delimiter的值指定字段宽度。

例如,假设文件01.txt包含

0001
1010
1111
0000
1001

以下是如何使用genfromtxt将其读入形状为 (5, 4( 的 NumPy 整数数组:

In [2]: import numpy as np                                                                                                                                
In [3]: data = np.genfromtxt('01.txt', delimiter=1, dtype=np.int8)                                                                                        
In [4]: data                                                                                                                                              
Out[4]: 
array([[0, 0, 0, 1],
[1, 0, 1, 0],
[1, 1, 1, 1],
[0, 0, 0, 0],
[1, 0, 0, 1]], dtype=int8)

假设您的文本文件每行包含 128 个字符(不包括换行符(,每个字符代表 1 字节/8 位,您可以使用

data = np.loadtxt(file, dtype=np.str)
bits_arr = []
for line in data:
byte_arr = np.frombuffer(line.encode('UTF-8'), dtype=np.uint8) # UTF-8 assumed
bits_arr.append(np.unpackbits(byte_arr).reshape(32,32))

然后,bits_arr每行将包含 1 个"32x32 位图"。请注意,如果在一行中读取无效的字节数 (!=128(,reshape(32,32)将失败。

旁注:在这里使用一个简单的readlines()可能更有效,而不是承担np.loadtxt的所有开销,因为您实际上并没有使用此函数可以为您做的事情。因此,代码可以简化为

bits_arr = []
with open(file, 'rb') as binfile:
line = binfile.readline().strip() # strip to remove newline char
byte_arr = np.frombuffer(line, dtype=np.uint8)
bits_arr.append(np.unpackbits(byte_arr).reshape(32,32))

最新更新