Numpy генерирует X случайных двоичных чисел с порогом определения в 1 строке [дубликат]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

32
задан Cupitor 25 October 2013 в 19:56
поделиться

5 ответов

Еще один подход, используя np.random.choice :

>>> np.random.choice([0, 1], size=(10,), p=[1./3, 2./3])
array([0, 1, 1, 1, 1, 0, 0, 0, 0, 0])
47
ответ дан Jaime 19 August 2018 в 15:01
поделиться
  • 1
    обратите внимание, что этот подход будет not дать вам точную долю нулей и единиц, которые вы запрашиваете. , , ответ на @mdml ниже будет. – dbliss 14 August 2018 в 17:21

Если я правильно понимаю вашу проблему, вы можете получить некоторую помощь с 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
ответ дан Abhijit 19 August 2018 в 15:01
поделиться

Простой однострочный: вы можете избежать использования списков целых чисел и распределений вероятностей, которые, на мой взгляд, являются неинтуитивными и излишними для этой проблемы, просто работая с bool s сначала, а затем при необходимости перейдя на int (при необходимости) хотя оставить его как массив bool должен работать в большинстве случаев).

>>> import numpy as np
>>> np.random.random(9) < 1/3.
array([False,  True,  True,  True,  True, False, False, False, False])   
>>> (np.random.random(36) < 1/3.).astype(int)
array([0, 0, 0, 0, 0, 1, 0, 0, 1])    
0
ответ дан Galactic Ketchup 19 August 2018 в 15:01
поделиться

Простым способом сделать это было бы сначала сгенерировать ndarray с долей нулей и единиц, которые вы хотите:

>>> 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])

Тогда вы можете просто shuffle массива, сделав распределение random:

>>> 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])

Обратите внимание, что этот подход даст вам точную пропорцию нулей / единиц, которые вы запрашиваете, в отличие от биномиального подхода. Если вам не нужна точная пропорция, то биномиальный подход будет работать нормально.

15
ответ дан mdml 19 August 2018 в 15:01
поделиться
  • 1
    Как глупо со мной! Правильно, я забыл о двоичном распределении. На самом деле кто-то отправил двоичный файл прямо перед вами, но он удалил свой ответ (не знаю, почему !!) – Cupitor 25 October 2013 в 20:13

Вы можете использовать numpy.random.binomial. Например. предположим, что frac - доля единиц:

In [50]: frac = 0.15

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

In [52]: sample.sum()
Out[52]: 1567
13
ответ дан Warren Weckesser 19 August 2018 в 15:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: