为什么npy的大小比csv大?

Yeo*_*Jin 5 csv numpy python-3.x

截图

我将csv更改为npy文件.更改后,csv文件的大小为5GB,npy为13GB.我认为npy文件比csv更有效.我误解了吗?为什么npy的大小比csv大?

我刚刚用过这段代码

full = pd.read_csv('data/RGB.csv', header=None).values
np.save('data/RGB.npy', full, allow_pickle=False, fix_imports=False)
Run Code Online (Sandbox Code Playgroud)

和数据结构如下:

R, G, B, is_skin
2, 5, 1, 0
10, 52, 242, 1
52, 240, 42, 0
...(row is 420,711,257)
Run Code Online (Sandbox Code Playgroud)

ead*_*ead 10

在您的情况下,元素是0到255之间的整数,包括0和255.这意味着,保存为ASCII最多需要它

  • 数字为3个字符
  • 1个字符 ,
  • 空白的1个字符

这导致光盘上每个元素最多5个字节(平均值略低).

Pandas将此读取/解释为一个int64数组(请参阅full.dtype参考资料)作为默认值,这意味着每个元素需要8个字节,这会导致更大的npy文件(大多数为零!).

要保存0到255之间的整数,我们只需要一个字节,因此npy文件的大小可以减少8倍而不会丢失任何信息 - 只需告诉pandas它需要将数据解释为无符号8位整数:

full = pd.read_csv(r'e:\data.csv', dtype=np.uint8).values
# or to get rid of pandas-dependency:
# full = np.genfromtxt(r'e:\data.csv', delimiter=',', dtype=np.uint8, skip_header=1)
np.save(r'e:/RGB.npy', full, allow_pickle=False, fix_imports=False)
# an 8 times smaller npy-file
Run Code Online (Sandbox Code Playgroud)

大多数情况下,npy格式需要较少的空间,但是可能存在ASCII格式导致较小文件的情况.

例如,如果数据主要包含一个数字非常小的数字和一些非常大的数字,那么对于它们来说真的需要8字节:

  • 在ASCII格式中,您平均每个元素支付2个字节(不需要写空白,,因为分隔符足够好).
  • 在numpy格式中,您将为每个元素支付8个字节.