2013-03-03 92 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')