这个想法是文本文件有 150 行,其中每行是 1024 位的字符串(32x32 图像的表示形式(。
我想要实现的是拥有一个包含 150 个元素的数组,其中每个元素都是大小为 1024 的数组。
通过尝试下面的代码,我得到了一个包含 150 个元素的数组,具有 inf 值。 有没有办法直接使用 numpy 的 loadtxt 将这些值转换为向量。
提前谢谢你!
import numpy as np
data = np.loadtxt("digits.txt")
如果每行的长度完全相同,并且只包含字符0
和1
,则可以使用numpy.genfromtxt
和delimiter=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))