我使用以下代码保存到文本文件:
filepath = open(filename, 'a')
np.savetxt(filepath, C, fmt='%i')
我来自C
我可以控制生成文件的大小,事先知道。因此,我想了解如何在Python中计算文件的大小。我的程序会生成numpy
形状矩阵(12500,65),其中包含值1或-1 。磁盘上生成的文本文件具有(2,024,874
字节),这对我来说没有意义!不应该被计算为(假设有符号整数的大小为8
,因为我明确地将其称为fmt='%i'
):`12500 * 65 * 8 = 6,500,000字节'?
答案 0 :(得分:2)
正如Mark所说,您正在保存文字,即"1"
,而不是\x01\x00...
。为了证明:
import io
import numpy as np
tenbyten = np.ones((10, 10), dtype=int)
myfile = io.BytesIO()
np.savetxt(myfile, tenbyten, fmt='%i')
len(myfile.getvalue()) # 200
myfile.getvalue()[:30] # b'1 1 1 1 1 1 1 1 1 1\n1 1 1 1 1 '
它是一串ASCII数字1和空格,带有换行符。我收集了一些-
混合物。如果您想要 pure 二进制文件,您可以执行以下操作:
raw_data = tenbyten.tobytes() # .tofile() to go to a file instead of bytestring
len(raw_data) # 800
raw_data[:10] # b'\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00'
要获得与您的6.5 MB相匹配的内容,您可以执行以下操作:len(np.empty((12500, 65), dtype='int64').tobytes())
请注意,原始数据非常 raw,并丢弃有关数据类型的所有信息,字节顺序和形状,所以以下是真的:
np.ones((10, 10)).tobytes() == np.ones((5, 20)).tobytes() == np.ones(100).tobytes()
如果您使用np.save
,则会使用元数据
my_npy = io.BytesIO()
np.save(my_npy, tenbyten)
len(my_npy.getbuffer()) # 880
my_npy.getvalue()[:70]
# b"\x93NUMPY\x01\x00F\x00{'descr': '<i8', 'fortran_order': False, 'shape': (10, 10), "
对于+ 1 / -1的情况,强制数据类型int8
(带my_array.astype('int8')
)基本上是一个免费的8倍数据压缩。