2017-12-08 36 views
1

numpy.recarray.tobytesの逆は何ですか?numpy.recarray.tobytesの逆数

ここ
>>> import numpy as np 
>>> A = np.array([(28483,27759)],dtype=[('x','<u2'),('y','<u2')]) 
>>> A.tobytes() 
'Cool' 

A 4バイトの構造化された配列で、tobytesは私がバイナリ形式でそれをシリアル化することができます。 dtypeオブジェクトを使用して、適切なサイズのバイナリ文字列を取得してデシリアライズするにはどうすればよいですか?

+0

ああ。答えのように聞こえます.... –

答えて

2

frombufferは、バイト列(またはより一般的にはbuffer protocolをサポートする任意のPythonオブジェクト)を配列として解釈すると思われます。デフォルトでは、dtypenp.float64となっていますが、構造dtypeを含む特定のdtypeを指定することができます。 frombuffer

>>> import numpy as np 
>>> A = np.frombuffer(b"Cool", dtype=[('x','<u2'),('y','<u2')]) 
>>> A 
array([(28483, 27759)], 
     dtype=[('x', '<u2'), ('y', '<u2')]) 

一つの癖は、それはあなたではなく、それらをコピーするよりも、それを与えたバイトを直接参照配列を作成することです。

>>> A = np.fromstring(b"Cool", dtype=[('x','<u2'),('y','<u2')]) 
>>> A["x"] = 23 
>>> A 
array([(23, 27759)], 
     dtype=[('x', '<u2'), ('y', '<u2')]) 
:あなたが書き込み可能な何かをしたい場合は、 np.fromstring代わりの np.frombufferを使用

>>> A["x"] = 23 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: assignment destination is read-only 

:それはあなたが(例えば)Pythonのバイト文字列でそれを使用した場合、結果の配列が読み取り専用であることを意味します

詳細については、this answerを参照してください。

あなたが(むしろ構造化DTYPEと普通のndarrayあるstructured array、より)本物のnumpyのrecord arrayをしたい場合、あなたはnd.rec.arrayに結果を渡すことができます。

>>> np.rec.array(A) 
rec.array([(28483, 27759)], 
      dtype=[('x', '<u2'), ('y', '<u2')]) 

録音・アレイは、非常に構造化された配列のようなものです独自のndarrayサブクラスを持ち、属性アクセスによるフィールドの取得を許可します。

>>> B = np.rec.array(A) 
>>> B.x 
array([28483], dtype=uint16) 
+0

それです!私は 'frombytes'を探し続けて何も見つけませんでした。ありがとう! –