Numpy: يثير عامل التخصيص التقسيم الخطأ ، والتقسيم المنفصل والعمل التعيين

تم إنشاؤها على ٩ فبراير ٢٠١٨  ·  3تعليقات  ·  مصدر: numpy/numpy

آسف إذا كانت هذه مشكلة معروفة ، لقد بحثت عنها ولكن هناك العديد من النتائج ...

هذا يعمل:

import numpy as np
a = np.array([1, 2, 3])
a = a / 4

لكن هذا يثير خطأ:

import numpy as np
a = np.array([1, 2, 3])
a /= 4

يسمى:

TypeError: No loop matching the specified signature and casting
was found for ufunc true_divide

هذا مفاجئ لأنني أتوقع منهم أن يفعلوا الشيء نفسه.

باستخدام numpy الإصدار 1.14.0.

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

أفترض أنك تستخدم بايثون 3. هذا سلوك متوقع في بايثون 3. نتيجة a / 4 لن تكون مصفوفة أعداد صحيحة بل مصفوفة فاصلة عائمة. عندما تقوم ببساطة بإعادة تعيين هذه النتيجة بالسطر a = a / 4 ، فلا بأس بذلك. يقوم بشكل أساسي بتحويل الكود إلى a = np.true_divide(a, 4) مما يؤدي إلى إنشاء مصفوفة فاصلة عائمة جديدة وإعادة تعيين الاسم a إليه.

عندما تحاول القيام بالتعيين الموضعي ، يُطلب من true_divide ufunc إعادة الإخراج إلى مصفوفة الأعداد الصحيحة الحالية a : np.true_divide(a, 4, out=a) . لا يوجد تنفيذ لـ true_divide يأخذ وسيطتين صحيحتين وينتج عددًا صحيحًا آخر ، لذلك تحصل على الاستثناء.

ال 3 كومينتر

أفترض أنك تستخدم بايثون 3. هذا سلوك متوقع في بايثون 3. نتيجة a / 4 لن تكون مصفوفة أعداد صحيحة بل مصفوفة فاصلة عائمة. عندما تقوم ببساطة بإعادة تعيين هذه النتيجة بالسطر a = a / 4 ، فلا بأس بذلك. يقوم بشكل أساسي بتحويل الكود إلى a = np.true_divide(a, 4) مما يؤدي إلى إنشاء مصفوفة فاصلة عائمة جديدة وإعادة تعيين الاسم a إليه.

عندما تحاول القيام بالتعيين الموضعي ، يُطلب من true_divide ufunc إعادة الإخراج إلى مصفوفة الأعداد الصحيحة الحالية a : np.true_divide(a, 4, out=a) . لا يوجد تنفيذ لـ true_divide يأخذ وسيطتين صحيحتين وينتج عددًا صحيحًا آخر ، لذلك تحصل على الاستثناء.

شكرا للتوضيح الواضح ، هذا منطقي. ساعدني ما يلي على فهم الاختلاف:

>>> a = [1 ,2, 3]
>>> b = a
>>> id(a) == id(b)
True
>>> a += [4, 5, 6]  # list object is changed, no new object created
>>> id(a) == id(b)
True
>>> a = a + [4, 5, 6]  # new object created, and assigned to `a`
>>> id(a) == id(b)
False

إذا فهمت بشكل صحيح ، فإن حقيقة أنه لا يوجد كائن جديد يتم إنشاؤه باستخدام += ، هو القياس لـ out=a .

طريقة واحدة لحل المشكلة هي استخدام dtype=float عند إنشاء المصفوفة.

هذا صحيح.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

MorBilly picture MorBilly  ·  4تعليقات

"
Pezhvuk picture Pezhvuk  ·  4تعليقات

keithbriggs picture keithbriggs  ·  3تعليقات

Foadsf picture Foadsf  ·  3تعليقات

dmvianna picture dmvianna  ·  4تعليقات