_التذكرة الأصلية http://projects.scipy.org/numpy/ticket/2084 في 2012-03-19 بواسطة astrofrog ، مخصصة لـ unknown._
يوضح ما يلي المشكلة - على الرغم من أن 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
في بعض الحالات ، يمكن أن يتسبب ذلك في حدوث أخطاء في التجزئة ، على الرغم من أنني لم أجد طريقة لإعادة إنتاج هذا باستمرار.
_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.
لم أتمكن من إنشاء تتبعات مكدس مفيدة - يبدو أن هذا الخطأ يتسبب في بعض تلف المكدس.
تم تغيير العنوان من Issue with concatenating structured arrays
إلى Issue with concatenating structured arrays (segmentation fault)
بواسطة trac user lcampagn في 2012-09-24
أعتقد أن هذا له علاقة بـ TODO عند numpy/core/src/multiarray/convert_datatype.c:1122
:
/* TODO: Also combine fields, subarrays, strings, etc */
على الأقل هذا هو الفشل النهائي في هذه القضية.
لم أتمكن من إعادة إنتاج segfault.
لقد بحثت أيضًا في هذا بما يكفي لإدراك أن القضية النهائية هنا هي مطالبة NumPy بدمج المصفوفات المنظمة التعسفية أكثر تعقيدًا من مطالبتهم بدمج السلاسل. تقدم هذه المشكلة حالة يكون فيها الجمع واضحًا للعين ، ولكن ليس من الواضح كيف يجب على NumPy دمج المصفوفات المنظمة التعسفية (افترض أنه يجب دمج الحقول التي تحمل الاسم نفسه؟ خذ اتحاد ما تبقى؟).
نظرًا لأنني جديد في هذا المشروع ، سأترك هذا مفتوحًا في الوقت الحالي ، وسأحاول العثور على مكان آخر لتوجيه جهودي :-P.
حسنا ، لا ينبغي أن segfault. يجب أن نرفع خطأ حتى يتم اكتشاف شيء ما.
نعم - إنها تثير خطأ الآن. لم أستطع الوصول إلى segfault.
charris : هل من فرصة
التعليق الأكثر فائدة
charris : هل من فرصة