【问题标题】:Is there a way to load a numpy unicode array into a memmap?有没有办法将 numpy unicode 数组加载到 memmap 中?
【发布时间】:2019-05-15 06:58:23
【问题描述】:

我正在尝试创建dtype='U' 的数组并使用numpy.save() 保存它,但是,当尝试将保存的文件加载到numpy.memmap 时,我收到与大小不是' 的倍数有关的错误U3'

我正在与python 3.5.2 合作。我尝试了以下代码,其中创建了一个空数组和另一个包含 3 个条目的数组,所有条目的长度均为 3 个字母,然后将数组保存到 file1.npy 文件中。

import numpy as np
arr = np.empty((1, 0), dtype='U')
arr2 = np.array(['111', '222', '333'], dtype='U')
arr = np.concatenate((arr, arr2), axis = None)
print(arr)
np.save('file1', arr)

rArr = np.memmap('file1.npy', dtype='U3', mode='r')

但是,当我尝试将文件加载到 numpy.memmap 时,我收到以下错误 ValueError: Size of available data is not a multiple of the data-type size.

有没有办法使用字符串将数据加载到numpy.memmap 中?我觉得我错过了一些简单的东西。

【问题讨论】:

  • 我看到了这个问题,但我不确定它是如何重复的。保存的文件是二进制文件。我相信还有另一个原因导致我收到错误消息,例如我不知道的文件中的一些额外数据。
  • 你试过np.loadmmap_mode吗?
  • @hpaulj,这确实有效。我不敢相信我错过了。我正在尝试不同的事情,但我忘了用np.loadmmap_mode 进行测试。另一方面,为了解决我最初的问题,我相信我也找到了答案。使用numpy.save 时,如果我删除该标题(文件中的第一行)并使用numpy.memmap,结果文件似乎有一个标题,我能够正确加载数据。所以我猜memmap 更适合手动保存的文件而不使用numpy.save

标签: python numpy numpy-ndarray numpy-memmap


【解决方案1】:

numpy.memmap 使用的文件是原始二进制文件,而不是NPY-format 文件。如果要读取内存映射的 NPY 文件,请使用 numpy.load 和参数 mmap_mode='r'(或任何其他合适的值)。

像你一样创建“file1.npy”后,下面是如何使用numpy.load 进行内存映射:

In [16]: a = np.load('file1.npy', mmap_mode='r')                                                                       

In [17]: a                                                                                                             
Out[17]: memmap(['111', '222', '333'], dtype='<U3')

【讨论】:

  • 谢谢,这证实了我对memmap 的怀疑。所以我将不得不手动保存稍后加载的二进制数据)。 np.load() 工作正常。
  • 或者,您可以通过array.tofile() 保存一个原始二进制文件,然后使用memmap 加载它。
【解决方案2】:

看起来np.load是你的朋友。

Doc

Issue

以下 sn-p 对我有用:

rArr = np.load('file1.npy', mmap_mode='r')

【讨论】:

    猜你喜欢
    • 2016-08-14
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多