Numpy: Проблема с объединением структурированных массивов (ошибка сегментации) (Trac # 2084)

Созданный на 20 окт. 2012  ·  7Комментарии  ·  Источник: numpy/numpy

_Оригинальный билет http://projects.scipy.org/numpy/ticket/2084 от 19.03.2012 @astrofrog , присвоено

Следующее демонстрирует проблему - хотя 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.
Мне не удалось сгенерировать полезные трассировки стека - похоже, эта ошибка вызывает некоторое повреждение стека.

Заголовок изменен с Issue with concatenating structured arrays на Issue with concatenating structured arrays (segmentation fault) пользователем trac lcampagn 24 сентября 2012 г.

Я думаю, это связано с TODO в numpy/core/src/multiarray/convert_datatype.c:1122 :

/* TODO: Also combine fields, subarrays, strings, etc */

По крайней мере, это окончательный провал в этом вопросе.

Мне не удалось воспроизвести segfault.

Я также достаточно углубился в это, чтобы понять, что главная проблема здесь - попросить NumPy объединить произвольные структурированные массивы - сложнее, чем попросить его объединить строки. Эта проблема представляет собой случай, когда комбинация очевидна для глаза, но неясно, как NumPy должен объединять произвольные структурированные массивы (предположим, что поля с одинаковыми именами должны быть объединены? Возьмите объединение того, что осталось?).

Поскольку я новичок в этом проекте, я пока оставлю это открытым и попытаюсь найти другое место, чтобы направить свои усилия :-P.

Что ж, это не должно быть segfault. Мы должны выдавать ошибку, пока что-нибудь не выясним.

Да, сейчас возникает ошибка. Я не мог получить segfault.

@charris : Есть ли шанс, что эту проблему можно будет открыть повторно? По крайней мере, в случае, когда все имена полей совпадают и находятся в одном порядке, я думаю, ясно, что результат должен иметь те же имена полей в этом порядке, и каждое поле должно использовать результат продвижения соответствующих типов.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги