Numpy: Masalah dengan array terstruktur penggabungan (kesalahan segmentasi) (Trac # 2084)

Dibuat pada 20 Okt 2012  ·  7Komentar  ·  Sumber: numpy/numpy

_Tiket asli http://projects.scipy.org/numpy/ticket/2084 pada 2012-03-19 oleh @astrofrog , ditetapkan ke tidak diketahui._

Hal berikut menunjukkan masalah tersebut - meskipun Numpy tahu cara menggabungkan bidang-bidang larik terstruktur, Numpy akan lumpuh jika seseorang mencoba untuk menggabungkan larik terstruktur itu sendiri:

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

Masalah serupa terjadi dengan nilai floating-point dari berbagai 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

Dalam beberapa kasus, ini bahkan dapat menyebabkan kesalahan segmentasi, meskipun saya belum menemukan cara untuk mereproduksi ini secara konsisten.

00 - Bug numpy.core

Komentar yang paling membantu

@charris :

Semua 7 komentar

_trac pengguna lcampagn menulis pada 2012-09-24_

Saya dapat mengonfirmasi bug ini dan mereproduksi kesalahan segmentasi:

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

Saya mengalami crash ini dalam beberapa kasus berbeda.
Saya dapat menyebabkan crash ini di Linux (1.6.1-6ubuntu1) dan di Windows.
Saya belum dapat menghasilkan jejak tumpukan yang berguna - tampaknya bug ini menyebabkan beberapa kerusakan tumpukan.

Judul diubah dari Issue with concatenating structured arrays menjadi Issue with concatenating structured arrays (segmentation fault) oleh trac user lcampagn pada 2012-09-24

Saya pikir ini ada hubungannya dengan TODO di numpy/core/src/multiarray/convert_datatype.c:1122 :

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

Setidaknya, ini adalah kegagalan terakhir dalam masalah ini.

Saya belum bisa mereproduksi segfault tersebut.

Saya juga telah menggali ini cukup untuk menyadari bahwa masalah terakhir di sini adalah meminta NumPy untuk menggabungkan array terstruktur yang sewenang-wenang lebih rumit daripada memintanya untuk menggabungkan string. Masalah ini menyajikan kasus di mana kombinasi terlihat jelas bagi mata, tetapi tidak jelas bagaimana NumPy harus menggabungkan array terstruktur sewenang-wenang (asumsikan bidang dengan nama yang sama akan digabungkan? Ambil gabungan dari apa yang tersisa?).

Karena saya baru dalam proyek ini, saya akan membiarkan ini terbuka untuk saat ini, dan mencoba mencari tempat lain untuk mengarahkan usaha saya :-P.

Nah, seharusnya tidak segfault. Kita harus meningkatkan kesalahan sampai sesuatu diketahui.

Ya - itu meningkatkan kesalahan sekarang. Saya tidak bisa membuatnya segfault.

@charris :

Apakah halaman ini membantu?
0 / 5 - 0 peringkat