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]
Ini seharusnya tidak mengembalikan indeks> 3, tetapi ketika elemen terakhir dari array bertopeng benar, itu mungkin mengembalikan index = 4
Masalah juga terjadi di Generator.choice
dalam versi pengembangan 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])
Sebelumnya saya menambahkan label "bug", tapi itu penilaian subjektif. Ada fungsi lain di numpy yang tidak menangani array bertopeng dengan benar (atau lebih baik, "dengan benar", karena "kebenaran" juga bisa menjadi panggilan penilaian) di mana kita tidak selalu menganggapnya sebagai bug. Mungkin ini hanya contoh dari perilaku yang tidak terdefinisi, dan jawaban singkat untuk masalah ini adalah "jangan lakukan itu!". Akan lebih baik, bagaimanapun, jika kita dapat mengajukan pengecualian daripada mengembalikan hasil yang tidak masuk akal.
Akan cukup mudah untuk menambahkan pemeriksaan eksplisit untuk larik bertopeng, dan meningkatkan kesalahan jika salah satu nilai benar-benar tertutup, tetapi itu terasa seperti perbaikan ad hoc yang sangat spesifik.
Apakah Generator.choice
dikirim ke __array_function__
? Jika tidak, maka mungkin harus.
Jika ya, maka saya pikir kita hanya membuang ini dengan semua "kerusakan maskedarray karena kita belum menerapkan __array_function__
belum" bug.
Sebelumnya saya menambahkan label "bug", tapi itu penilaian subjektif. Ada fungsi lain di numpy yang tidak menangani array bertopeng dengan benar (atau lebih baik, "dengan benar", karena "kebenaran" juga bisa menjadi panggilan penilaian) di mana kita tidak selalu menganggapnya sebagai bug. Mungkin ini hanya contoh dari perilaku yang tidak terdefinisi, dan jawaban singkat untuk masalah ini adalah "jangan lakukan itu!". Akan lebih baik, bagaimanapun, jika kita dapat mengajukan pengecualian daripada mengembalikan hasil yang tidak masuk akal.
Akan cukup mudah untuk menambahkan pemeriksaan eksplisit untuk larik bertopeng, dan meningkatkan kesalahan jika salah satu nilai benar-benar tertutup, tetapi itu terasa seperti perbaikan ad hoc yang sangat spesifik.
Saya pikir jika tidak menanganinya dengan benar, itu seharusnya tidak mengizinkan lewat array bertopeng (harus menimbulkan pengecualian) tetapi berfungsi dengan benar sebagian besar (berfungsi dengan baik kecuali beberapa kasus). itu dapat menyebabkan masalah potensial untuk lingkungan produksi.
Tidak ada penggunaan __array_function__
di Generator
. Sementara banyak masukan memaksa agar berperilaku baik C bersebelahan, mungkin saja beberapa fungsi tidak selalu memaksakan ini secara cukup religius.
Jika Anda menambahkan NPY_ARRAY_ENSUREARRAY
maka Anda akan mendapatkan ndarray yang penuh dan mengabaikan mask. Sulit untuk mengatakan ini "benar" untuk dilakukan. Dalam contoh @WarrenWeckesser , ini akhirnya menggunakan pm=np.array([.1,.2,.3,.4])
sebagai probabilitas.