Numpy: np.random.choice mengembalikan indeks di luar jangkauan pada masalah array bertopeng.

Dibuat pada 15 Agu 2020  ·  6Komentar  ·  Sumber: 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]

Ini seharusnya tidak mengembalikan indeks> 3, tetapi ketika elemen terakhir dari array bertopeng benar, itu mungkin mengembalikan index = 4

00 - Bug numpy.ma numpy.random

Semua 6 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat