Numpy: يعود np.random.choice خارج النطاق في مشكلة مصفوفة مقنعة.

تم إنشاؤها على ١٥ أغسطس ٢٠٢٠  ·  6تعليقات  ·  مصدر: numpy/numpy

import numpy as np

a = np.array([0.1, 0.2, 0.4, 0.3])
masked_a = np.ma.masked_array(a, [0, 0, 1, 1])
counter = np.zeros(len(a) + 1)
while True:
    action = np.random.choice(len(a), p=masked_a)
    counter[action] += 1
    print(counter / counter.sum())

# [0.09931198 0.20076697 0.         0.         0.69992105]

لا ينبغي أن تُرجع فهرسًا> 3 ، ولكن عندما يكون العنصر الأخير من المصفوفة المقنعة صحيحًا ، فقد يُرجع الفهرس = 4

00 - Bug numpy.ma numpy.random

ال 6 كومينتر

تحدث المشكلة أيضًا في Generator.choice في إصدار التطوير من numpy:

In [1]: import numpy as np

In [2]: np.__version__ 
Out[2]: '1.20.0.dev0+986e533'

In [3]: rng = np.random.default_rng()

In [4]: pm = np.ma.masked_array([0.1, 0.2, 0.4, 0.3], mask=[0, 0, 1, 1])

In [5]: rng.choice(4, p=pm, size=12)
Out[5]: array([4, 4, 4, 0, 4, 1, 4, 0, 0, 4, 4, 4])

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

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

هل يتم إرسال Generator.choice إلى __array_function__ ؟ إذا لم يحدث ذلك ، فمن المحتمل أنه ينبغي.

إذا كان الأمر كذلك ، فأعتقد أننا قمنا فقط بإلقاء هذا مع كل أخطاء "maskedarray decay" الأخرى لأننا لم ننفذ __array_function__ حتى الآن ".

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

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

أعتقد أنه إذا لم يتعامل معها بشكل صحيح ، فلا ينبغي أن تسمح بتمرير مصفوفة مقنعة (يجب أن تثير استثناء) ولكنها تعمل بشكل صحيح في الغالب (تعمل بشكل جيد باستثناء بعض الحالات). قد يسبب مشاكل محتملة لبيئة الإنتاج.

لا يوجد استخدام لـ __array_function__ في Generator . في حين أن العديد من مدخلات القوة تكون متجاورة بشكل جيد ، فمن المحتمل أن تكون هذه الحالة هي أن بعض الوظائف لا تفرض هذا بشكل ديني كافٍ.

إذا أضفت NPY_ARRAY_ENSUREARRAY ، فسينتهي بك الأمر بمصفوفة ndarray ممتلئة وتتجاهل القناع. من الصعب القول أن هذا "صحيح". في مثالWarrenWeckesser ، ينتهي الأمر باستخدام pm=np.array([.1,.2,.3,.4]) كاحتمالات .

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