Numpy: Problema con la concatenación de matrices estructuradas (error de segmentación) (Trac # 2084)

Creado en 20 oct. 2012  ·  7Comentarios  ·  Fuente: numpy/numpy

_Billete original http://projects.scipy.org/numpy/ticket/2084 el 19/03/2012 por

Lo siguiente demuestra el problema: aunque Numpy sabe cómo concatenar los campos de una matriz estructurada, se bloquea si uno intenta concatenar las matrices estructuradas en sí:

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 problema similar ocurre con valores de punto flotante de diferente endianidad:

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

En algunos casos, esto incluso puede causar fallas de segmentación, aunque todavía tengo que encontrar una manera de reproducir esto de manera consistente.

00 - Bug numpy.core

Comentario más útil

@charris : ¿

Todos 7 comentarios

_trac usuario lcampagn escribió el 2012-09-24_

Puedo confirmar este error y reproducir el error de segmentación:

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

Me he encontrado con este accidente en algunos casos diferentes.
Puedo causar este bloqueo tanto en Linux (1.6.1-6ubuntu1) como en Windows.
No he podido generar rastros de pila útiles; parece que este error causa algunos daños en la pila.

El título cambió de Issue with concatenating structured arrays a Issue with concatenating structured arrays (segmentation fault) por el usuario de trac lcampagn el 2012-09-24

Creo que esto tiene que ver con TODO en numpy/core/src/multiarray/convert_datatype.c:1122 :

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

Al menos, este es el último fracaso en este tema.

No he podido reproducir el segfault.

También he investigado esto lo suficiente como para darme cuenta de que el problema final aquí es pedirle a NumPy que combine matrices estructuradas arbitrarias es más complicado que pedirle que combine cadenas. Este problema presenta un caso en el que la combinación es obvia a simple vista, pero no está claro cómo NumPy debería fusionar matrices estructuradas arbitrarias (¿asumir que los campos con el mismo nombre se van a combinar? ¿Tomar la unión de lo que queda?).

Como soy nuevo en este proyecto, dejaré esto abierto por ahora e intentaré encontrar otro lugar para dirigir mis esfuerzos :-P.

Bueno, no debería segregarse. Deberíamos generar un error hasta que se averigüe algo.

Sí, ahora está generando un error. No pude conseguir que segfault.

@charris : ¿

¿Fue útil esta página
0 / 5 - 0 calificaciones