为什么npy的大小大于csv?

时间:2018-11-21 07:55:33

标签: python-3.x csv numpy

Screenshot

我将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)

和这样的数据结构:

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

1 个答案:

答案 0 :(得分:8)

在您的情况下,元素是0到255之间的整数(包括0和255)。也就是说,将其保存为ASCII最多

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

这会导致光盘上每个元素最多5个字节(平均少一些)。

Pandas默认将其读取/解释为int64数组(请参见full.dtype),这意味着每个元素需要8个字节,这导致npy文件的大小更大(大多数都是零!)。

要保存0到255之间的整数,我们只需要一个字节,因此可以将npy文件的大小减小8倍而不会丢失任何信息-只是告诉熊猫它需要将数据解释为无符号的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

大多数时候,npy格式需要较少的空间,但是在某些情况下,ASCII格式会导致文件较小。

例如,如果数据主要由非常小的数字组成,其中只有一位数字,而又有一些非常大的数字,那么对于它们,实际上需要8个字节:

  • 以ASCII格式,您平均每个元素要支付2个字节(无需写空格,,本身就足够了,因为分隔符就足够了。)
  • 以numpy格式,您将为每个元素支付8个字节。