2017-09-12 4 views
0

私はこのようになります8つの16バイト長のボイドレコードを持つnumpyの配列があります。配列を記録するためにnumpyボイド配列を変換しますか?

array([[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], 
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], 
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], 
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], 
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], 
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], 
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], 
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]], 
     dtype='|V16') 

そして、このようになりますカスタムDTYPEの8つの16B長いレコードを配列にキャストする必要があります。

[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')] 

どうすれば実現できますか?

私はarray.astype(self.dtype, copy=False, casting="unsafe")、 を試みたが、私は私にはあまり意味がありません

ValueError: setting an array element with a sequence.

を取得します。

このデータはPyOpenCL(バッファをマッピングするメモリ)から来ていますが、実際には入力フォーマットやdtypeを変更できません。

+1

['numpy.ndarray.view'](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.view.html)がそれを行う可能性があります。より具体的で安全なツールにすることができますが、入力形式を変更することが本当に不可能かどうかは疑問です。 – user2357112

+0

'numpy.ndarray.view'が完璧に動作しました。ありがとうございます。私はそれを受け入れることができるように答えにすることができますか? PyOpenclではdtypeを制御するためのノブがありますが、レコードではなく単純なdtypeでしか機能しないようです。おそらくバグですが、適切に修正するためにも 'view'はおそらくまだ必要です。 – cube

答えて

1

バイト数が一致する限り、viewはこの種の変換を行うことができます。これは、データバッファがどのように「表示」されるかを変えるだけです。

In [36]: dt=np.dtype([(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')]) 
In [37]: dt 
Out[37]: dtype([(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')]) 

In [39]: x = np.zeros((3,), dtype=dt) 
In [40]: x 
Out[40]: 
array([(0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)], 
     dtype=[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')]) 
In [41]: x.view('|V16') 
Out[41]: 
array([[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], 
     [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]], 
     dtype='|V16') 
In [42]: x.view('|V16').view(dt) 
Out[42]: 
array([(0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)], 
     dtype=[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')]) 

私はよくastypeまたはviewは、構造化された配列を変換するための正しい方法であるかどうかを把握する実験する必要があります。

関連する問題