ASCII字符串作为Python 3中numpy字符串数组的dtype

时间:2013-03-03 08:55:24

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

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中为特定长度的ASCII字符串定义dtype(每个字符1个字节)?
  • 我如何以同样适用于Python 2的方式实现?
  • 奖金问题:我可以进一步限制字母表,例如到ascii_uppercase,每个字符节省一两个?

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

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

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

这是要走的路吗?

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

我如何将其实际用作dtype

1 个答案:

答案 0 :(得分:7)

您可以使用'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')