2013-03-03 99 views
3

NumPy的的string D型细胞似乎对应于Python的str并因此的Python 2.x和3.x之间改变:ASCII字符串作为D型为字符串在Python numpy的阵列3

在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字符串(每字符1个字节)定义dtype?
  • 我该如何在Python 2中使用它?
  • 奖励问题:我能否进一步限制字母,例如:到ascii_uppercase,并保存一个或两个字符?

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

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

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

这就是要走的路吗?

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

我该如何将它作为dtype

+0

我很确定回答你最后的问题是一个很大的问题。 AFAIK,而且我在一段时间以后再研究它,没有办法将小于8位的数据打包成小于1个字节。绝对不适用于6或7位类型,但除非您自己处理,否则在一个8位容器中不能有2个四位值。即使是'bool'数组,它们存储的每个“True”/“False”值都会占用全部8位。 – Jaime 2013-03-04 08:30:18

+0

@Jaime哇,好吧。然后我想要1个字节:) – 2013-03-04 08:53:14

回答

6

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