【问题标题】:ASCII string as dtype for numpy array of strings in Python 3ASCII 字符串作为 Python 3 中 numpy 字符串数组的 dtype
【发布时间】:2013-02-17 12:12:40
【问题描述】:

NumPy 的 string dtype 似乎对应于 Python 的 str,因此可以在 Python 2.x 和 3.x 之间进行更改:

在 Python 2.7 中:

In [1]: import numpy as np

In [2]: np.dtype((np.str_, 1)).itemsize
Out[2]: 1

In [3]: np.dtype((np.unicode_, 1)).itemsize
Out[3]: 4

在 Python 3.3 中:

In [2]: np.dtype((np.str_, 1)).itemsize
Out[2]: 4

NumPy 的版本在这两种情况下都是 1.7.0。

我正在编写一些我想在两个 Python 版本上工作的代码,并且我想要一个 ASCII 字符串数组(4x 内存开销是不可接受的)。所以问题是:

  • 如何在 Python 3 中为特定长度(每个字符 1 个字节)的 ASCII 字符串定义 dtype?
  • 如何以在 Python 2 中也适用的方式执行此操作?
  • 额外问题:我能否进一步限制字母表,例如到ascii_uppercase,每个字符节省一点或两个?

我认为可能的答案是第一个问题的字符数组(即有一个字符数组而不是字符串数组)。好像我可以在构造一个时指定项目大小:

chararray(shape, itemsize=1, unicode=False, buffer=None, offset=0,
          strides=None, order=None)

更新:不,itemsize 实际上是字符数。但是还有unicode=False

这是要走的路吗?

它也会回答最后一个问题吗?

我该如何实际使用它作为dtype

【问题讨论】:

  • 我很确定你最后一个问题的答案是一个很大的否定。 AFAIK,我确实研究过一段时间,没有办法将小于 8 位的数据打包成小于 1 字节。绝对不适用于 6 位或 7 位类型,但除非您自己处理,否则单个 8 位容器中也不能有 2 个四位值。即使是 bool 数组,它们存储的每个 True/False 值也会占用完整的 8 位。
  • @Jaime 哇,好的。然后我想要 1 个字节 :)

标签: python arrays string numpy python-3.x


【解决方案1】:

您可以使用“S”typestr:

>>> np.array(['Hello', 'World'], dtype='S')
array([b'Hello', b'World'], 
      dtype='|S5')

同样在 2.6/2.7 中,str 别名为bytes(或np.bytes_):

>>> np.dtype((bytes, 1)) # 2.7
dtype('|S1')
>>> np.dtype((bytes, 1)) # 3.2
dtype('|S1')

并且支持b'' 文字:

>>> np.array([b'Hello', b'World']) # 2.7
array(['Hello', 'World'], 
      dtype='|S5')
>>> np.array([b'Hello', b'World']) # 3.2
array([b'Hello', b'World'], 
      dtype='|S5')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 2019-03-28
    相关资源
    最近更新 更多