Numpy: Enh: وظيفة إنشاء صفيف الكائن

تم إنشاؤها على ٢ يونيو ٢٠١٥  ·  4تعليقات  ·  مصدر: numpy/numpy

كما تمت مناقشته في الإصدار رقم 5303 ، لا يمكن حاليًا إنشاء مصفوفات من نوع الكائن الذي يحتوي على تسلسلات متساوية الطول ، حيث تتم قراءة التسلسل تلقائيًا كعناصر صفيف. هناك اقتراح للقيام بذلك للقوائم فقط ، ولكن هذا قد يكون انقطاعًا رئيسيًا في التوافق مع الإصدارات السابقة وسيتطلب فترة إهمال طويلة.

هناك طريقة أخرى تتمثل في الحصول على وظيفة صريحة لإنشاء مصفوفات ذات نوع كائن. ربما يمكن أن يسمى هذا "مصفوفة الأجسام". سيكون الإعداد الافتراضي لهذه الوظيفة هو أخذ تسلسل ، والنظر في كل عنصر من عناصر التسلسل كعنصر في مصفوفة كائن 1D.

ومع ذلك ، يمكن أن تحتوي الوظيفة على وسيطة اختيارية "ndim" أو "عمق" ، والتي يمكن استخدامها لتحديد عدد مستويات التسلسل التي يجب اعتبارها جزءًا من المصفوفة. قد يكون هذا افتراضيًا إلى 0 (يتم اعتبار المستوى الأبعد فقط). قد يثير هذا استثناءً إذا كانت الأبعاد غير متطابقة.

لاحظ أن هذا الأسلوب لا يتعارض مع البديل ، ولكن له ميزة أنه لن يكسر التوافق مع الإصدارات السابقة.

لذلك على سبيل المثال:

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))])
>>> arr
array([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], dtype=object)
>>> arr.shape
(2,)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=1)
>>> arr
array([[(1, 2, 3), (4, 5, 6)],
       [(7, 8, 9), (10, 11, 12)]], dtype=object)
>>> arr.shape
(2, 2)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=2)
>>> arr
array([[[1, 2, 3],
        [4, 5, 6]],

       [[7, 8, 9],
        [10, 11, 12]]], dtype=object)
>>> arr.shape
(2, 2, 3)

التعليق الأكثر فائدة

آمل ألا يفوتني أي شيء ، ولكن يبدو لي أن الوسيطة ndmax لن تحل المشكلة التي تم الإبلاغ عنها فقط ("_إنشاء مصفوفات من نوع الكائن تحتوي على تسلسلات متساوية الطول_") ، ولكنها ستحقق أيضًا مكاسب في الأداء تلك الحالات التي يكون فيها ، على سبيل المثال ، الكائن الأخير في الإدخال ليس قائمة (أو قائمة بطول مختلف). انظر أيضا هذا السؤال .

ال 4 كومينتر

أعتقد أن أسهل طريقة للحصول على قوائم متساوية الحجم في مصفوفة كائنات هي في خطوتين:

>>> a = empty((2,), dtype=np.object)
>>> a[:] = [[1,2,3],[4,5,6]]

>>> b = empty((2,3), dtype=np.object)
>>> b[:] = [[1,2,3],[4,5,6]]

من المحتمل أن يعمل تنفيذ objectarray على هذا النحو.

نعم ، هذه هي أفضل طريقة حاليًا ، لكنها مطولة بلا داع. ومن هنا جاءت هذه الفكرة.

آمل أن يكون تنفيذ هذه الفكرة قادرًا ببساطة على تجاوز التحويل التلقائي المستخدم في الدالة array واستبدالها بمُنشئ ndarray .

آمل ألا يفوتني أي شيء ، ولكن يبدو لي أن الوسيطة ndmax لن تحل المشكلة التي تم الإبلاغ عنها فقط ("_إنشاء مصفوفات من نوع الكائن تحتوي على تسلسلات متساوية الطول_") ، ولكنها ستحقق أيضًا مكاسب في الأداء تلك الحالات التي يكون فيها ، على سبيل المثال ، الكائن الأخير في الإدخال ليس قائمة (أو قائمة بطول مختلف). انظر أيضا هذا السؤال .

أي تقدم أو خطط لتنفيذ ndmax ؟ ما أفعله الآن:

np.array([*data, None])[:-1]

# This would look a lot cleaner:
np.array(data, ndmax=1)
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات