Numpy: 構造化配列の連結に関する問題(セグメンテーション違反)(Trac#2084)

作成日 2012年10月20日  ·  7コメント  ·  ソース: numpy/numpy

_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

場合によっては、これがセグメンテーション違反を引き起こすことさえありますが、これを一貫して再現する方法はまだ見つかりません。

00 - Bug numpy.core

最も参考になるコメント

@charris :この問題が再開される可能性はありますか? 少なくともフィールド名がすべて一致し、同じ順序である場合、結果はこれらの同じフィールド名をこの順序で持つ必要があり、各フィールドは対応するタイプをプロモートした結果を使用する必要があることは明らかだと思います。

全てのコメント7件

_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 :この問題が再開される可能性はありますか? 少なくともフィールド名がすべて一致し、同じ順序である場合、結果はこれらの同じフィールド名をこの順序で持つ必要があり、各フィールドは対応するタイプをプロモートした結果を使用する必要があることは明らかだと思います。

このページは役に立ちましたか?
0 / 5 - 0 評価