Numpy: Problem mit verketteten strukturierten Arrays (Segmentierungsfehler) (Trac # 2084)

Erstellt am 20. Okt. 2012  ·  7Kommentare  ·  Quelle: numpy/numpy

_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.

00 - Bug numpy.core

Hilfreichster Kommentar

@charris :

Alle 7 Kommentare

_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 :

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen