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

标签 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)

最佳答案

在您的情况下,元素是 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-format 需要较少的空间,但有时 ASCII 格式会产生较小的文件。

    例如,如果数据主要由一位非常小的数字和一些非常大的数字组成,那么对于它们来说,实际上需要 8 个字节:
  • 在 ASCII 格式中,您平均为每个元素支付 2 个字节(不需要写空格,, 单独作为分隔符就足够了)。
  • 在 numpy 格式中,您将为每个元素支付 8 个字节。
  • 关于python-3.x - 为什么npy的大小比csv大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53407468/

    相关文章:

    python - IP 地址的 Tkinter 条目验证

    python - 除非包装在函数中,否则为什么打印 for 循环(整数)输出会产生语法错误?

    python - 我如何 "merge"行 groupby 在 Pandas 数据框中具有相同的值?

    python - 矩阵的每一行和每一列中的最小值 - Python

    python - 拆分包含多个字典的列表

    python - CSV 文件的 Unicode 到 UTF8 - Python 通过 xlrd

    node.js - Model.create 和 Model.collection.insert 都没有完全保存对象

    c# - 继承类型的 CSV 序列化

    python - 在 pandas/matplotlib 中格式化时间序列 x 轴

    numpy - 在 Numpy 中管理高维度