Numpy: 串联结构化数组的问题(分段故障)(Trac#2084)

创建于 2012-10-20  ·  7评论  ·  资料来源: numpy/numpy

_ @astrofrog在2012-03-19发行的原始票证http://projects.scipy.org/numpy/ticket/2084 ,已分配给未知帐户。_

以下内容演示了该问题-即使Numpy知道如何串联结构化数组的字段,但是如果人们尝试串联结构化数组本身也会崩溃:

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

具有不同字节序的浮点值也会发生类似的问题:

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

在某些情况下,这甚至可能导致分段错误,尽管我还没有找到一致地重现此错误的方法。

00 - Bug numpy.core

最有用的评论

@charris :是否有可能重新打开此问题? 至少在所有字段名称都匹配且顺序相同的情况下,我认为很明显结果应按此顺序具有这些相同的字段名称,并且每个字段都应使用提升相应类型的结果。

所有7条评论

_trac用户lcampagn发表于2012-09-24_

我可以确认此错误并重现细分错误:

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

我在几个不同的实例中遇到了这次崩溃。
我可以在Linux(1.6.1-6ubuntu1)和Windows上导致此崩溃。
我无法生成有用的堆栈跟踪信息-看来该错误会导致某些堆栈损坏。

标题由lracagn用户lcampagn于2012年9月24日由Issue with concatenating structured arrays变为Issue with concatenating structured arrays (segmentation fault)

我认为这与numpy/core/src/multiarray/convert_datatype.c:1122的TODO有关:

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

至少,这是此问题中的最终失败。

我无法重现该段错误。

我还深入研究了这一点,以意识到这里的最终问题是要求NumPy组合任意结构化数组比要求它组合字符串要复杂得多。 此问题提出了一种组合在外观上很明显的情况,但尚不清楚NumPy应如何合并任意结构化数组(假设要合并具有相同名称的字段?采用剩余的并集?)。

由于我是这个项目的新手,所以我暂时将其保持打开状态,并尝试寻找其他地方来指导我的工作:-P。

好吧,它不应该出现段错误。 我们应该提出一个错误,直到找到答案。

是的,它现在引发错误。 我无法解决问题。

@charris :是否有可能重新打开此问题? 至少在所有字段名称都匹配且顺序相同的情况下,我认为很明显结果应按此顺序具有这些相同的字段名称,并且每个字段都应使用提升相应类型的结果。

此页面是否有帮助?
0 / 5 - 0 等级