【发布时间】:2021-08-11 13:04:59
【问题描述】:
我已经使用 np.savez() 保存了一个 numpy 数组,并打开它:
a = np.load('/file.npz', allow_pickle=True)
a = cp.array(a['arr_0'])
但是如何读取数组a 的特定行?我知道我可以通过 a[x:y] 访问某些行,其中 x 和 y 是常数,因此 x
非常感谢在索引 x 和 y 之间的特定行中加载比以典型方式加载更快的任何帮助!建议在答案中使用 memmap 的答案,但这不会提高速度。提前感谢您的帮助:)
【问题讨论】:
-
您应该可以通过设置
mmap_mode的np.load来做到这一点。像a = np.load('/file.npz', allow_pickle=True, mmap_mode='r')这样的东西。虽然我对这个选项不太熟悉,所以我不能确定它是否适用于这种文件格式。 numpy.org/doc/stable/reference/generated/numpy.load.html -
感谢@KyleParsons 的建议,但在numpy.org/doc/stable/reference/generated/… 上它说:“r”:打开现有文件以只读方式。 ‘r+’:打开现有文件进行读写。 ‘w+’:创建或覆盖现有文件进行读写。 ‘c’:写时复制:分配影响内存中的数据,但不保存更改。我认为这些选项中的任何一个都无法实现我想要做的事情
-
你说你想访问一行。这不就是读书的意思吗?这些选项未涵盖您想要做什么?
-
据我所知,阅读不允许我从保存的矩阵中选择要打开的 x 和 y 之间的特定行。会@KyleParsons 吗?
-
这就是内存映射的作用。它将“打开”您的整个文件,但在这种情况下,打开不会将其加载到 RAM 中,它只会指向硬盘驱动器上的某个位置。然后,当您对数组执行某些操作时,它会将其加载到 RAM 中,但它可以选择性地将一部分加载到 RAM 中,这应该更快并且需要更少的 RAM。
标签: python arrays numpy pickle