Numpy: Problema com concatenação de matrizes estruturadas (falha de segmentação) (Trac # 2084)

Criado em 20 out. 2012  ·  7Comentários  ·  Fonte: numpy/numpy

_Tíquete original http://projects.scipy.org/numpy/ticket/2084 em 19/03/2012 por

O seguinte demonstra o problema - embora Numpy saiba como concatenar os campos de uma matriz estruturada, ele travará se alguém tentar concatenar as próprias matrizes estruturadas:

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

Um problema semelhante ocorre com valores de ponto flutuante de diferentes 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

Em alguns casos, isso pode até causar falhas de segmentação, embora eu ainda não tenha encontrado uma maneira de reproduzir isso de forma consistente.

00 - Bug numpy.core

Comentários muito úteis

@charris :

Todos 7 comentários

_trac usuário lcampagn escreveu em 2012-09-24_

Posso confirmar esse bug e reproduzir a falha de segmentação:

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

Eu encontrei essa falha em alguns casos diferentes.
Posso causar esse travamento tanto no Linux (1.6.1-6ubuntu1) quanto no Windows.
Não fui capaz de gerar rastreamentos de pilha úteis - parece que esse bug causa alguma corrupção de pilha.

Título alterado de Issue with concatenating structured arrays para Issue with concatenating structured arrays (segmentation fault) pelo usuário trac lcampagn em 24/09/2012

Acho que isso tem a ver com o TODO em numpy/core/src/multiarray/convert_datatype.c:1122 :

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

Pelo menos, esta é a falha final nesta questão.

Não consegui reproduzir o segfault.

Eu também pesquisei nisso o suficiente para perceber que o problema final aqui é pedir ao NumPy para combinar arrays estruturados arbitrários é mais complicado do que pedir para combinar strings. Este problema apresenta um caso em que a combinação é óbvia à vista, mas não está claro como o NumPy deve mesclar matrizes estruturadas arbitrárias (assume que os campos com o mesmo nome devem ser combinados? Faça a união do que resta?).

Como sou novo neste projeto, vou deixar em aberto por enquanto e tentar encontrar outro lugar para direcionar meus esforços :-P.

Bem, não deve causar falha em seg. Devemos levantar um erro até que algo seja descoberto.

Sim - está gerando um erro agora. Não consegui fazer o segfault.

@charris :

Esta página foi útil?
0 / 5 - 0 avaliações