_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.
_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 : ¿
Comentario más útil
@charris : ¿