_2012-03-19の@astrofrogによる元のチケットhttp://projects.scipy.org/numpy/ticket/2084 、不明に割り当てられています。_
以下は、問題を示しています-Numpyは構造化配列のフィールドを連結する方法を知っていますが、構造化配列自体を連結しようとするとクラッシュします。
In [1]: import numpy as np
In [2]: d1 = np.array(zip(['a','b','c']), dtype=[('b', '|S1')])
In [3]: d2 = np.array(zip(['aa','bb','cc']), dtype=[('b', '|S2')])
In [4]: np.hstack([d1['b'],d2['b']])
Out[4]:
array(['a', 'b', 'c', 'aa', 'bb', 'cc'],
dtype='|S2')
In [5]: np.hstack([d1, d2])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/Users/tom/<ipython-input-5-bd5cc420043d> in <module>()
----> 1 np.hstack([d1, d2])
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/shape_base.pyc in hstack(tup)
268
269 """
--> 270 return _nx.concatenate(map(atleast_1d,tup),1)
271
TypeError: invalid type promotion
異なるエンディアンの浮動小数点値でも同様の問題が発生します。
In [1]: import numpy as np
In [2]: d1 = np.array(zip([1,2,3]), dtype=[('a', '<f4')])
In [3]: d2 = np.array(zip([1,2,3]), dtype=[('a', '>f4')])
In [4]: np.hstack([d1['a'],d2['a']])
Out[4]: array([ 1., 2., 3., 1., 2., 3.], dtype=float32)
In [5]: np.hstack([d1, d2])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/Users/tom/<ipython-input-5-bd5cc420043d> in <module>()
----> 1 np.hstack([d1, d2])
/Users/tom/Library/Python/2.7/lib/python/site-packages/numpy/core/shape_base.pyc in hstack(tup)
271 # As a special case, dimension 0 of 1-dimensional arrays is "horizontal"
272 if arrs[0].ndim == 1:
--> 273 return _nx.concatenate(arrs, 0)
274 else:
275 return _nx.concatenate(arrs, 1)
TypeError: invalid type promotion
場合によっては、これがセグメンテーション違反を引き起こすことさえありますが、これを一貫して再現する方法はまだ見つかりません。
_tracユーザーlcampagnは2012-09-24に書き込みました_
このバグを確認して、セグメンテーション違反を再現できます。
>>> import numpy as np
>>> a = np.empty(1, dtype=[('x', object)])
>>> b = np.empty(1, dtype=[('x', float)])
>>> np.concatenate([a,b])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: invalid type promotion
>>> np.concatenate([a,b])
Segmentation fault (core dumped)
私はいくつかの異なるインスタンスでこのクラッシュに遭遇しました。
Linux(1.6.1-6ubuntu1)とWindowsの両方でこのクラッシュを引き起こす可能性があります。
有用なスタックトレースを生成できませんでした。このバグがスタックの破損を引き起こしているようです。
2012-09-24にtracユーザーlcampagnによってタイトルがIssue with concatenating structured arrays
からIssue with concatenating structured arrays (segmentation fault)
されました
これはnumpy/core/src/multiarray/convert_datatype.c:1122
のTODOと関係があると思います:
/* TODO: Also combine fields, subarrays, strings, etc */
少なくとも、これはこの問題の最終的な失敗です。
セグメンテーション違反を再現できませんでした。
また、これを十分に掘り下げて、ここでの最終的な問題は、NumPyに任意の構造化配列を結合するように要求することは、文字列を結合するように要求するよりも複雑であることを理解しました。 この問題は、組み合わせが目に見える場合を示していますが、NumPyが任意の構造化配列をマージする方法が明確ではありません(同じ名前のフィールドが結合されると仮定しますか?残っているものの結合を取りますか?)。
私はこのプロジェクトに慣れていないので、今はこれを開いたままにして、他の場所を見つけて自分の努力を指示しようとします:-P。
まあ、それはセグメンテーション違反であってはなりません。 何かがわかったら、エラーを発生させる必要があります。
ええ、それは今エラーを引き起こしています。 セグメンテーション違反になりませんでした。
@charris :この問題が再開される可能性はありますか? 少なくともフィールド名がすべて一致し、同じ順序である場合、結果はこれらの同じフィールド名をこの順序で持つ必要があり、各フィールドは対応するタイプをプロモートした結果を使用する必要があることは明らかだと思います。
最も参考になるコメント
@charris :この問題が再開される可能性はありますか? 少なくともフィールド名がすべて一致し、同じ順序である場合、結果はこれらの同じフィールド名をこの順序で持つ必要があり、各フィールドは対応するタイプをプロモートした結果を使用する必要があることは明らかだと思います。