Создание случайных переменных в Python с одной трети массива, равной нулю

1

Я хочу создать случайные переменные в python и использовать следующий ниже код weights = np.random.random(10) но я хочу создать случайные переменные, так что одна треть весов должна быть равна нулю. Есть ли способ? Я также пробовал код ниже, но это не то, что я хочу

weights = np.random.random(7)
weights.append(0, 0, 0)
Теги:
arrays
numpy
random

5 ответов

2
Лучший ответ

С разъяснением, что вы хотите, чтобы 0 появлялось случайным образом, вы можете просто использовать shuffle:

weights = np.random.random(7)
weights = np.append(weights,[0, 0, 0])
np.random.shuffle(weights)
  • 0
    Обратите внимание, что ваш код будет быстрее и эффективнее, если вы будете использовать замену вместо добавления, как предлагают другие ответы. Сгенерируйте 10 случайных значений, затем: weights[-3:] = [0,0,0]
2

Один простой способ:

>>> import numpy as np
>>>                                                                                                                 
>>> a = np.clip(np.random.uniform(-0.5, 1, (100,)), 0, np.inf)
>>> a
array([0.39497669, 0.65003362, 0.        , 0.        , 0.        ,                                                  
       0.75545815, 0.30772786, 0.1805628 , 0.        , 0.        ,                                                  
       0.        , 0.82527704, 0.        , 0.63983682, 0.89283051,                                                  
       0.25173721, 0.18409163, 0.63631959, 0.59095185, 0.        ,                                                  
       0.85817311, 0.        , 0.06769175, 0.        , 0.67807471,                                                  
       0.29805637, 0.03429861, 0.53077809, 0.32317273, 0.52346321,                                                  
       0.22966515, 0.98175502, 0.54615167, 0.        , 0.88853359,                                                  
       0.        , 0.70622272, 0.08106305, 0.        , 0.8767082 ,                                                  
       0.52920044, 0.        , 0.        , 0.29394736, 0.4097331 ,                                                  
       0.77977164, 0.62860222, 0.        , 0.        , 0.14899124,                                                  
       0.81880283, 0.        , 0.1398242 , 0.        , 0.50113732,                                                  
       0.        , 0.68872893, 0.15582668, 0.        , 0.34789122,                                                  
       0.18510949, 0.60281713, 0.21097922, 0.77419626, 0.29588479,                                                  
       0.18890799, 0.9781896 , 0.96220508, 0.52201816, 0.71087763,                                                  
       0.        , 0.43540516, 0.99297503, 0.        , 0.69248893,                                                  
       0.05157044, 0.        , 0.75131066, 0.        , 0.        ,                                                  
       0.25627591, 0.53367521, 0.58151298, 0.85662171, 0.455367  ,
       0.        , 0.        , 0.21293519, 0.52337335, 0.        ,
       0.68644488, 0.        , 0.        , 0.39695189, 0.        ,
       0.40860821, 0.84549468, 0.        , 0.21247807, 0.59054669])
>>> np.count_nonzero(a)
67

Он равномерно рисует из [-0.5, 1], а затем устанавливает все ниже нуля до нуля.

2

Установите приблизительно 1/3 весов

Это гарантирует, что примерно одна треть ваших весов равна 0:

weights = np.random.random(10)/np.random.choice([0,1],10,p=[0.3,0.7])

weights[np.isinf(weights)] = 0
# or 
# weights[weights == np.inf] = 0

>>> weights
array([0.        , 0.25715864, 0.        , 0.80958258, 0.12880619,
       0.48781856, 0.52278911, 0.76541417, 0.87736431, 0.        ])

То, что он делает, делит около 1/3 ваших значений на 0, давая вам inf, затем просто замените inf на 0

Установите ровно 1/3 весов

В качестве альтернативы, если вам нужно ровно 1/3 (или в вашем случае, 3 из 10), вы можете заменить 1/3 ваших весов на 0:

weights = np.random.random(10)
# Replace 3 with however many indices you want changed...
weights[np.random.choice(range(len(weights)),3,replace=False)] = 0

>>> weights
array([0.        , 0.36839012, 0.        , 0.51468295, 0.45694205,
       0.23881473, 0.1223229 , 0.68440171, 0.        , 0.15542469])

Это выбирает 3 случайных индекса из весов и заменяет их 0

1
size = 10
v = np.random.random(size)
v[np.random.randint(0, size, size // 3)] = 0

Немного оптимизирован (поскольку генерация случайных чисел не является "дешевой"):

v = np.zeros(size)
nnonzero = size - size // 3
idx = np.random.choice(size, nnonzero, replace=False)
v[idx] = np.random.random(nnonzero)
0

Что касается замены первой трети элементов на 0, то перетасуйте ее в следующем порядке

    weights = np.random.random(10)
    weights[: weights.size / 3] = 0
    np.random.shuffle(weights)
  • 0
    Это добавляет 0 к первым трем числам, но я хочу также произвольно назначить нули
  • 0
    Тогда вы можете использовать np.random.shuffle, как предлагает Ахмед Юсиф

Ещё вопросы

Сообщество Overcoder
Наверх
Меню