_Ursprüngliches Ticket http://projects.scipy.org/numpy/ticket/2084 am 19.03.2012 von @astrofrog , zugewiesen an unknown._
Das Folgende zeigt das Problem - obwohl Numpy weiß, wie die Felder eines strukturierten Arrays verkettet werden, stürzt es ab, wenn versucht wird, die strukturierten Arrays selbst zu verketten:
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
Ein ähnliches Problem tritt bei Gleitkommawerten unterschiedlicher Endianität auf:
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
In einigen Fällen kann dies sogar zu Segmentierungsfehlern führen, obwohl ich noch keinen Weg gefunden habe, dies konsistent zu reproduzieren.
_trac user lcampagn schrieb am 24.09.2012_
Ich kann diesen Fehler bestätigen und den Segmentierungsfehler reproduzieren:
>>> 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)
Ich bin in einigen Fällen auf diesen Absturz gestoßen.
Ich kann diesen Absturz sowohl unter Linux (1.6.1-6ubuntu1) als auch unter Windows verursachen.
Ich konnte keine nützlichen Stapelspuren generieren - es scheint, dass dieser Fehler eine Stapelverfälschung verursacht.
Der Titel wurde vom Trac-Benutzer lcampagn am 24.09.2012 von Issue with concatenating structured arrays
in Issue with concatenating structured arrays (segmentation fault)
geändert
Ich denke, das hat mit dem TODO bei numpy/core/src/multiarray/convert_datatype.c:1122
zu tun:
/* TODO: Also combine fields, subarrays, strings, etc */
Zumindest ist dies der ultimative Fehler in dieser Ausgabe.
Ich konnte den Segfault nicht reproduzieren.
Ich habe mich auch genug damit befasst, um zu erkennen, dass das ultimative Problem hier darin besteht, NumPy zu bitten, beliebig strukturierte Arrays zu kombinieren, komplizierter ist, als es zu bitten, Strings zu kombinieren. Dieses Problem stellt einen Fall dar, in dem die Kombination für das Auge offensichtlich ist, aber nicht klar ist, wie NumPy beliebig strukturierte Arrays zusammenführen soll (vorausgesetzt, Felder mit demselben Namen sollen kombiniert werden? Nehmen Sie die Vereinigung der verbleibenden Elemente?).
Da ich neu in diesem Projekt bin, lasse ich dies vorerst offen und versuche, einen anderen Ort zu finden, an dem ich meine Bemühungen lenken kann :-P.
Nun, es sollte kein Fehler sein. Wir sollten einen Fehler auslösen, bis etwas herausgefunden wird.
Ja - es wird jetzt ein Fehler ausgelöst. Ich konnte es nicht zum Segfault bringen.
@charris :
Hilfreichster Kommentar
@charris :