【问题标题】:Lazy version of numpy.unpackbitsnumpy.unpackbits 的懒惰版本
【发布时间】:2018-06-14 20:26:39
【问题描述】:

我使用 numpy.memmap 仅将数组的部分加载到我需要的内存中,而不是加载整个巨大的数组。我想对 bool 数组做同样的事情。

不幸的是,bool memmap 数组的存储并不经济:根据lsbool memmap 文件需要与同一数组的uint8 memmap 文件一样多的空间形状。

所以我使用 numpy.unpackbits 来节省空间。不幸的是,它似乎并不懒惰:它很慢并且可能导致MemoryError,因此显然它将数组从磁盘加载到内存中,而不是在uint8 数组上提供“bool 视图” .

因此,如果我只想从文件中加载 bool 数组的某些条目,我首先必须计算它们属于哪些 uint8 条目,然后将 numpy.unpackbits 应用于该条目,然后再次对其进行索引.

难道没有一种偷懒的方法可以在位压缩的 memmap 文件上获得“bool 视图”吗?

【问题讨论】:

    标签: python numpy boolean mmap numpy-memmap


    【解决方案1】:

    不可能。位压缩数组的内存布局与您要查找的内容不兼容。数组布局的 NumPy shape-and-strides 模型没有子字节分辨率。即使您要创建一个模拟您想要的视图的类,尝试将它与正常的 NumPy 操作一起使用也需要物化 NumPy 可以使用的表示,此时您将不得不花费您不想要的内存花费。

    【讨论】:

    • 谢谢!如果可能,请添加此信息的来源。重写 NumPy 是否有帮助,或者是否存在基本的硬件限制? (例如,一些非常低级的组件不允许将来自不同位置的非连续位“收集”到数组中)
    • @root:现代计算机体系结构没有可位寻址的内存,因此尝试支持这一点将非常昂贵。至于来源,here's one 用于 NumPy 数组表示。
    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多