_Оригинальный билет 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
В некоторых случаях это может даже вызвать ошибки сегментации, хотя мне еще предстоит найти способ воспроизвести это последовательно.
Пользователь _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 : Есть ли шанс, что эту проблему можно будет открыть повторно? По крайней мере, в случае, когда все имена полей совпадают и находятся в одном порядке, я думаю, ясно, что результат должен иметь те же имена полей в этом порядке, и каждое поле должно использовать результат продвижения соответствующих типов.
Самый полезный комментарий
@charris : Есть ли шанс, что эту проблему можно будет открыть повторно? По крайней мере, в случае, когда все имена полей совпадают и находятся в одном порядке, я думаю, ясно, что результат должен иметь те же имена полей в этом порядке, и каждое поле должно использовать результат продвижения соответствующих типов.