de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 Cupitor
Cupitor
Question

Biner acak array dengan proporsi tertentu dari orang-orang?

Apa yang lebih efisien(mungkin vectorized dengan Matlab terminologi) cara untuk menghasilkan nomor acak dari angka satu dan nol dengan proporsi tertentu? Khusus dengan Numpy?

Seperti kasus saya ini khusus untuk 1/3, kode saya adalah:

import numpy as np 
a=np.mod(np.multiply(np.random.randomintegers(0,2,size)),3)

Tapi apakah ada fungsi built-in yang bisa menangani hal ini lebih efisien setidaknya untuk situasi `K/N dimana K dan N adalah bilangan asli?

49 2013-10-25T18:56:13+00:00 6
Pemrograman
arrays
random
python
numpy
random-sample
Solution / Answer
 Jaime
Jaime
25 Oktober 2013 в 7:18
2013-10-25T19:18:58+00:00
Lebih
Sumber
Sunting
#22623854

Namun pendekatan lain, menggunakan np.acak.pilihan:

>>> np.random.choice([0, 1], size=(10,), p=[1./3, 2./3])
array([0, 1, 1, 1, 1, 0, 0, 0, 0, 0])
67
0
 mdml
mdml
25 Oktober 2013 в 7:09
2013-10-25T19:09:51+00:00
Lebih
Sumber
Sunting
#22623852

Cara sederhana untuk melakukan hal ini akan lebih menghasilkan sebuah ndarray dengan proporsi angka nol dan satu yang anda inginkan:

>>> import numpy as np
>>> N = 100
>>> K = 30 # K zeros, N-K ones
>>> arr = np.array([0] * K + [1] * (N-K))
>>> arr
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1])

Maka anda hanya dapat shuffle array, membuat distribusi acak:

>>> np.random.shuffle(arr)
>>> arr
array([1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0,
       1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1,
       1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,
       0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1,
       1, 1, 1, 0, 1, 1, 1, 1])

Perhatikan bahwa pendekatan ini akan memberikan anda proporsi yang tepat dari nol/orang-orang yang anda minta, seperti mengatakan binomial pendekatan. Jika anda don't membutuhkan proporsi yang tepat, maka binomial pendekatan ini akan bekerja baik-baik saja.

21
0
Warren Weckesser
Warren Weckesser
25 Oktober 2013 в 7:07
2013-10-25T19:07:30+00:00
Lebih
Sumber
Sunting
#22623851

Anda dapat menggunakan numpy.acak.binomial. E. g. misalkan frac adalah proporsi dari orang-orang:

In [50]: frac = 0.15

In [51]: sample = np.random.binomial(1, frac, size=10000)

In [52]: sample.sum()
Out[52]: 1567
16
0
 Abhijit
Abhijit
25 Oktober 2013 в 7:10
2013-10-25T19:10:33+00:00
Lebih
Sumber
Sunting
#22623853

Jika saya memahami masalah anda dengan benar, anda mungkin mendapatkan beberapa bantuan dengan numpy.random.shuffle

>>> def rand_bin_array(K, N):
    arr = np.zeros(N)
    arr[:K]  = 1
    np.random.shuffle(arr)
    return arr

>>> rand_bin_array(5,15)
array([ 0.,  1.,  0.,  1.,  1.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,
        0.,  0.])
4
0
Galactic Ketchup
Galactic Ketchup
1 Agustus 2018 в 2:33
2018-08-01T14:33:02+00:00
Lebih
Sumber
Sunting
#22623855

Sederhana satu-liner: anda dapat menghindari menggunakan daftar bilangan bulat dan distribusi probabilitas, yang tidak mudah ditebak dan berlebihan untuk masalah ini menurut saya, dengan hanya bekerja dengan bool pertama dan kemudian casting untukintjika diperlukan (meskipun meninggalkan itu sebagaibool` array harus bekerja dalam banyak kasus).

>>> import numpy as np
>>> np.random.random(9) < 1/3.
array([False,  True,  True,  True,  True, False, False, False, False])   
>>> (np.random.random(9) < 1/3.).astype(int)
array([0, 0, 0, 0, 0, 1, 0, 0, 1])    
Galactic Ketchup
Galactic Ketchup
Jawaban edit 3 Agustus 2019 в 7:29
0
0
 joelostblom
joelostblom
27 Maret 2019 в 4:14
2019-03-27T16:14:02+00:00
Lebih
Sumber
Sunting
#22623856

Cara lain untuk mendapatkan jumlah yang tepat dari satu dan nol adalah untuk sampel indeks tanpa penggantian menggunakan np.acak.pilihan:

arr_len = 30
num_ones = 8

arr = np.zeros(arr_len, dtype=int)
idx = np.random.choice(range(arr_len), num_ones, replace=False)
arr[idx] = 1

Keluar:

arr

array([0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1,
       0, 0, 0, 0, 0, 1, 0, 0])
0
0
Related communities 6
Python Indonesia
Python Indonesia
24 686 pengguna
Programmer Python Indonesia. Group ini dikelola oleh sejumlah admin. Baca pesan tersemat / pinned message: https://t.me/pythonID/217588
Buka telegram
Indonesian Python Warriors
Indonesian Python Warriors
1 462 pengguna
Di grup ini tidak ada kewajiban untuk menggunakan username dan foto. Yang tidak boleh adalah spamming. Gak boleh baper, kalau nanya yang bener, eror jangan difoto pake HP, gunakan screenshot, code copas ke pastebin.com lalu share link ke sini.
Buka telegram
Python-ID Jogja
Python-ID Jogja
962 pengguna
Buka telegram
BASIC PYTHON INDONESIA
BASIC PYTHON INDONESIA
214 pengguna
Buka telegram
Python Newbie Indonesia
Python Newbie Indonesia
180 pengguna
Peraturan grup Python Newbie 🌻Dilarang spam 🌻Dilarang menggunakan bahasa kasar 🌻Dilarang beriklan di grup tanpa seizin admin Beberapa video dasar python dapat diliat melalui channel youtube juan aditya Jangan lupa untuk subscribe ya🙏
Buka telegram
PythonWealth Indonesia 🇮🇩
PythonWealth Indonesia 🇮🇩
29 pengguna
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 1 hari yang lalu
2
Akshit Mehta
Terdaftar 4 hari yang lalu
3
me you
Terdaftar 1 minggu yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi