_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.
_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 :
Komentar yang paling membantu
@charris :