dtype文字列のフィールドがあり、長さが異なるレコード配列を連結しようとすると、連結は失敗します。
次の例でわかるように、連結は「f1」が同じ長さの場合は機能しますが、そうでない場合は失敗します。
In [1]: import numpy as np
In [2]: a = np.core.records.fromarrays( ([1,2], ["one","two"]) )
In [3]: b = np.core.records.fromarrays( ([3,4,5], ["three","four","three"]) )
In [4]: c = np.core.records.fromarrays( ([6], ["six"]) )
In [5]: np.concatenate( (a,c) )
Out[5]:
array([(1, 'one'), (2, 'two'), (6, 'six')],
dtype=[('f0', '<i8'), ('f1', '|S3')])
In [6]: np.concatenate( (a,b) )
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/u/jegannas/<ipython console> in <module>()
TypeError: expected a readable buffer object
ただし、文字列のサイズは異なりますが、(レコードではなく)配列を連結するだけで成功します。
In [8]: np.concatenate( (a['f1'], b['f1']) )
Out[8]:
array(['one', 'two', 'three', 'four', 'three'],
dtype='|S5')
これは、レコードを連結するときの連結のバグですか、それとも予想される動作ですか。私はこれを克服するために次の方法しか考えていません。
In [10]: np.concatenate( (a.astype(b.dtype), b) )
Out[10]:
array([(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), (5, 'three')],
dtype=[('f0', '<i8'), ('f1', '|S5')]
しかし、ここでの問題は、すべての再配列を実行する必要があることです。連結して最大の文字列長を見つけ、それを使用する必要があります。レコード配列に複数の文字列列がある場合は、他のいくつかのことも追跡する必要があります。
少なくとも今のところ、これを克服するための最良の方法は何だと思いますか?