_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.
_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 :
Commentaire le plus utile
@charris :