【问题标题】:Load numpy array of strings python 3加载numpy字符串数组python 3
【发布时间】:2019-07-22 12:37:40
【问题描述】:

我正在将代码从 python 2 转换为 python 3。该数组最初保存在 python 2 中。作为我的一些代码的一部分,我加载了一个我保存的字符串数组。在 python 2 中,我可以简单地将其加载为

arr = np.load("path_to_string.npy")

它给了我

arr = ['str1','str2' etc...]

然而,当我在 python 3 中做同样的事情时,它不起作用,我反而得到了。

arr = [b'str1',b'str2' etc...]

我认为这意味着字符串存储为不同的数据类型。我尝试使用以下方法转换它们:

 arr = [str(i) for i in arr]

但这只会使问题更加复杂。有人可以解释为什么会发生这种情况以及如何解决吗?我敢肯定它是微不足道的,但只是在画一个空白?

【问题讨论】:

  • 由于文件是用python2保存的,所以需要使用np.load()中的'encoding'参数。阅读here
  • 将编码设置为它们建议的任何值(字节、ASCII 或 latin1)会导致相同的问题。设置 fix_imports=True 也无济于事
  • 你也可以[i.decode() for i in arr]。
  • 是的,谢谢,这解决了!
  • @Vishal: numpyastype 方法会更快地进行批量转换,但是可以,假设语言环境编码是合理的(或者文本是纯 ASCII 而你不是在一个真正奇怪的语言环境中),这将达到相同的结果,产生一个 list 而不是一个新的 numpy 数组。

标签: python string numpy


【解决方案1】:

需要明确的是,如果它们在 Python 2 中是 strs,那么在 Python 3 中 bytes 是“正确”类型,因为它们都存储字节数据;如果你想要任意文本数据,你可以在 Python 2 中使用unicode

对于numpy,这确实是正确的行为; numpy 不想默默地从面向字节的数据转换为面向文本的数据(除其他问题外,这样做会使内存使用量膨胀 4 倍,因为所有 Unicode 字符的固定宽度表示每个使用四个字节特点)。如果你真的想从bytes 更改为str,你可以显式地转换它,虽然它有点hacky:

>>> arr  # Original version
array([[b'abc', b'123'],
       [b'foo', b'bar']], dtype='|S3')
>>> arr = arr.astype('U')  # Cast from "[S]tring" to "[U]nicode" equivalent
>>> arr
array([['abc', '123'],
       ['foo', 'bar']], dtype='<U3')

【讨论】:

  • 谢谢!将其存储为字节是有道理的。快速玩一下也发现稍微不那么冗长: arr = np.load('path').astype('str') 也有效:)
  • @user3235916:呵呵。当您输入时,我发现astype('U') 也可以正常工作。 numpy 比我预期的更有帮助。
猜你喜欢
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 2016-10-02
  • 1970-01-01
  • 2012-06-14
相关资源
最近更新 更多