آسف إذا كانت هذه مشكلة معروفة ، لقد بحثت عنها ولكن هناك العديد من النتائج ...
هذا يعمل:
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
يأخذ وسيطتين صحيحتين وينتج عددًا صحيحًا آخر ، لذلك تحصل على الاستثناء.
شكرا للتوضيح الواضح ، هذا منطقي. ساعدني ما يلي على فهم الاختلاف:
>>> 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
عند إنشاء المصفوفة.
هذا صحيح.
التعليق الأكثر فائدة
أفترض أنك تستخدم بايثون 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
يأخذ وسيطتين صحيحتين وينتج عددًا صحيحًا آخر ، لذلك تحصل على الاستثناء.