Misalkan saya memiliki array numpy

np.array([
    [3, 0, 5, 3, 0, 1],
    [0, 1, 2, 1, 5, 2],
    [4, 3, 5, 3, 1, 4],
    [2, 5, 2, 5, 3, 1],
    [0, 1, 2, 1, 5, 2],
])

Sekarang, saya ingin mengganti beberapa elemen secara acak dengan 0. Sehingga saya memiliki output seperti ini

np.array([
    [3, 0, 0, 3, 0, 1],
    [0, 1, 2, 0, 5, 2],
    [0, 3, 0, 3, 1, 0],
    [2, 0, 2, 5, 0, 1],
    [0, 0, 2, 0, 5, 0],
])
2
partoftheorigin 26 Agustus 2017, 22:56

2 jawaban

Jawaban Terbaik

Kita dapat menggunakan np.random.choice(..., replace=False) untuk memilih secara acak sejumlah indeks datar unik bukan nol dan kemudian cukup mengindeks dan mengatur ulang indeks tersebut dalam array input.

Jadi, salah satu solusinya adalah -

def make_more_sparsey(a, n):
    # a is input array
    # n is number of non-zero elements to be reset to zero
    idx = np.flatnonzero(a) # for performance, use np.flatnonzero(a!=0)
    np.put(a, np.random.choice(idx, n, replace=False),0)
    return a

Contoh lari -

In [204]: R = np.array([
     ...:     [3, 0, 5, 3, 0, 1],
     ...:     [0, 1, 2, 1, 5, 2],
     ...:     [4, 3, 5, 3, 1, 4],
     ...:     [2, 5, 2, 5, 3, 1],
     ...:     [0, 1, 2, 1, 5, 2],
     ...: ])

In [205]: make_more_sparsey(R, n=5)
Out[205]: 
array([[3, 0, 5, 3, 0, 1],
       [0, 1, 0, 0, 5, 2],
       [4, 3, 5, 3, 1, 4],
       [2, 5, 0, 5, 3, 1],
       [0, 1, 0, 1, 0, 2]])
6
Divakar 26 Agustus 2017, 21:06

Gunakan metode np.ravel atau ravel untuk membuat bidang yang diratakan. Perhatikan bahwa metode flatten selalu membuat salinan, jadi mutasi tidak akan berfungsi.

a = np.array([
    [3, 0, 5, 3, 0, 1],
    [0, 1, 2, 1, 5, 2],
    [4, 3, 5, 3, 1, 4],
    [2, 5, 2, 5, 3, 1],
    [0, 1, 2, 1, 5, 2],
])
r = a.ravel()
r[random.randrange(0, len(r))] = 0
0
o11c 26 Agustus 2017, 20:41