الدالتان numpy.array و numpy.asarray لها سلوك محدد جيدًا عند تطبيقها على قوائم المصفوفات: إذا كانت المصفوفات المدرجة لها نفس الأبعاد والحجم ، يتم قلب القائمة بأحد أبعاد المصفوفة الناتجة (دعنا نسميها " الوضع 1 "). إذا لم يكن كذلك ، يتم إرجاع مصفوفة من المصفوفات ("الوضع 2").
ومع ذلك ، يبدو أن سلوك numpy.array و numpy.asarray في "الوضع 2" يعتمد على عدد العناصر في المصفوفات. الكود التالي ليس أنيقًا جدًا بالنسبة إلى فائدة numpy ، ولكنه يعمل:
>>> a = np.array([1, 2, 3])
>>> b = np.array([[1, 0], [0, 1]])
>>> np.asarray([a, b])
array([array([1, 2, 3]), array([[1, 0],
[0, 1]])], dtype=object)
لكن ما يلي لا:
>>> a = np.array([1, 2])
>>> b = np.array([[1, 0], [0, 1]])
>>> np.asarray([a, b])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.4/dist-packages/numpy/core/numeric.py", line 474, in asarray
return array(a, dtype, copy=False, order=order)
ValueError: could not broadcast input array from shape (2,2) into shape (2)
من الواضح أن المشكلة هي أنه عندما يرى numpy.asarray أن البُعد الأول له نفس الطول في a
و b
، فإنه يحاول الانتقال إلى "mode 1" ، وهو أمر مستحيل هنا.
تحرير: أنا أستخدم numpy 1.10.4 و python 3.4.3.
متفق عليه ، هذا النوع من المنطق الاحتياطي مؤسف. لقد ناقشنا عدم إنشاء مصفوفات dtype=object
ما لم يتم توفير نوع dtype بشكل صريح. يجب أن تكون IMO np.array([a, b], dtype=object)
الطريقة الوحيدة لكتابة أيٍّ من هاتين الطريقتين - ولن تحتاج إلى إجراء أي فحوصات على الشكل.
لا يساعد تقديم dtype=object
- ما زلت تحصل على نفس الخطأ.
ومع ذلك ، فإن إضافة مصفوفة فارغة تتيح لك تجنبها:
arr_of_arr = np.array([np.array([]), a, b])[1:]
لا يزال موجودًا في 1.14.4
ppwwyyxx - في الواقع ، جزئيًا لأنه ليس تغييرًا تافهًا ، جزئيًا لأنه ليس شيئًا يصطدم به المرء طوال الوقت ، لذا فإن الإلحاح منخفض نسبيًا (وليس هناك الكثير من الأشخاص الذين لديهم الوقت للمساهمة ...).
ولكن ما قد يساعد هنا هو توضيح ماهية السلوك المطلوب بالضبط. ذكر shoyer أيضًا طلبًا طويل الأمد يطلب صراحةً dtype=object
إذا كان ذلك مطلوبًا في الواقع ، وإلا فإنه يجمع TypeError
لأي شيء لا يمكن تحليله كمصفوفة رقمية أو سلسلة (# 5353). لقد كنت أفكر مؤخرًا فيما إذا كان من المفيد الحصول على dtype='structured'
بالمثل ، والذي من شأنه أن يفرض بشكل صارم الفرق بين القوائم على أنها تشير إلى عناصر من مصفوفة و tuples كعناصر من نوع dtype منظم.
أنا على استعداد للمساهمة إذا كان بإمكان أي شخص أن يرسل لي بعض المؤشرات حول ما يجب القيام به. لقد ألقيت نظرة سريعة على الكود ذي الصلة في ctors.c ، يبدو أن منطق المُنشئ معقد للغاية لأنه يحتاج إلى التعامل مع العديد من أشكال الإدخال المختلفة.
نفس المشكلة: # 8330
أعتقد أن هذا قد يتم إصلاحه بواسطة # 11601. تحرير: ليس كذلك.
إذن ، ما يحدث هنا هو تقريبًا:
a = np.array([1, 2])
b = np.array([[1, 0], [0, 1]])
out = np.asarray([a, b])
# translates to
out = np.empty((2, 2)) #shape is correctly inferred
out[0,:] = a
out[1,:] = b # error comes from here
التعليق الأكثر فائدة
لا يساعد تقديم
dtype=object
- ما زلت تحصل على نفس الخطأ.ومع ذلك ، فإن إضافة مصفوفة فارغة تتيح لك تجنبها: