Numpy: Problème de concaténation de tableaux structurés (erreur de segmentation) (Trac # 2084)

Créé le 20 oct. 2012  ·  7Commentaires  ·  Source: numpy/numpy

_Billet original http://projects.scipy.org/numpy/ticket/2084 le 19/03/2012 par

Ce qui suit illustre le problème - même si Numpy sait comment concaténer les champs d'un tableau structuré, il se bloque si l'on essaie de concaténer les tableaux structurés eux-mêmes:

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

Un problème similaire se produit avec des valeurs à virgule flottante de différentes endian-ness:

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

Dans certains cas, cela peut même provoquer des erreurs de segmentation, même si je n'ai pas encore trouvé de moyen de reproduire cela de manière cohérente.

00 - Bug numpy.core

Commentaire le plus utile

@charris :

Tous les 7 commentaires

_trac user lcampagn rédigé le 2012-09-24_

Je peux confirmer ce bug et reproduire le défaut de segmentation:

>>> 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)

J'ai rencontré ce crash dans quelques cas différents.
Je peux provoquer ce crash sous Linux (1.6.1-6ubuntu1) et sous Windows.
Je n'ai pas été en mesure de générer des traces de pile utiles - il semblerait que ce bogue provoque une corruption de pile.

Le titre est passé de Issue with concatenating structured arrays à Issue with concatenating structured arrays (segmentation fault) par l'utilisateur trac lcampagn le 24/09/2012

Je pense que cela a à voir avec le TODO à numpy/core/src/multiarray/convert_datatype.c:1122 :

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

Au moins, c'est l'échec ultime de ce problème.

Je n'ai pas pu reproduire le segfault.

J'ai également suffisamment creusé dans cela pour réaliser que le problème ultime ici est de demander à NumPy de combiner des tableaux structurés arbitraires est plus compliqué que de lui demander de combiner des chaînes. Ce problème présente un cas où la combinaison est évidente à l'œil nu, mais on ne sait pas comment NumPy devrait fusionner des tableaux structurés arbitraires (supposons que les champs portant le même nom doivent être combinés? Prenons l'union de ce qui reste?).

Puisque je suis nouveau dans ce projet, je vais laisser cela ouvert pour le moment, et essayer de trouver un autre endroit pour diriger mes efforts :-P.

Eh bien, il ne devrait pas segfault. Nous devrions signaler une erreur jusqu'à ce que quelque chose soit compris.

Ouais - ça soulève une erreur maintenant. Je n'ai pas pu le faire segfault.

@charris :

Cette page vous a été utile?
0 / 5 - 0 notes