python-3.x - 为什么npy的大小大于csv?-LMLPHP

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

最佳答案

在您的情况下,元素是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
    

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

    例如,如果数据主要由非常小的数字和一位数字组成,而很少的非常大的数字组成,那么对于它们,实际上需要8个字节:

    ASCII格式的
  • 每个元素平均要支付2个字节(无需写空格,仅,就可以了,因为分隔符就足够了)。
  • 以numpy格式的
  • ,您将为每个元素支付8个字节。
  • 10-06 05:18