6

NumPyのstringdtypeはPythonのdtypeに対応しているようで、Python2.xstrと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文字列の配列が必要です(4倍のメモリオーバーヘッドは許容されません)。したがって、質問は次のとおりです。

  • Python 3で特定の長さ(1文字あたり1バイト)のASCII文字列のdtypeを定義するにはどうすればよいですか?
  • Python 2でも機能する方法でそれを行うにはどうすればよいですか?
  • ボーナスの質問:アルファベットをさらに制限して、たとえば、ascii_uppercase文字ごとに1〜2ビット節約できますか?

私が潜在的な答えとして見ているものは、最初の質問の文字配列です(つまり、文字列の配列ではなく文字配列の配列があります)。アイテムを作成するときにアイテムのサイズを指定できるようです。

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

更新:いや、これitemsizeは実際には文字数です。しかし、まだありunicode=Falseます。

それは行く方法ですか?

最後の質問にも答えますか?

そして、実際にそれをどのように使用しdtypeますか?

4

1 に答える 1

9

'S' typestrを使用できます:

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

また、2.6 / 2.7strでは次のようにエイリアスされます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')
于 2013-03-05T08:29:15.487 に答える