Генерировать матрицу без 0 значений случайным образом

#python #python-3.x #random

#python #python-3.x #Случайный

Вопрос:

Я пытаюсь создать матрицу случайным образом в интервалах [-5,-1] и [1,5]. Как я могу создать матрицу с учетом интервалов (без значений 0) со случайными значениями?

Я пытался сделать это с randint из numpy и с piecewise . В первом случае невозможно указать 2 интервала, а во втором случае случайное число, генерируемое, когда значение близко к 0 (больше -1 и меньше 1), всегда одно и то же.

     x=np.random.randint(-5,5,(2,3))
    np.piecewise(x, [x <= 1, x >=-1 ], [np.random.randint(-5,-1), np.random.randint(1,5)])
  

Я хотел бы иметь матрицу таким образом без значений 0:

   [-2,-3,-1
    1,-2, 3]
  

Комментарии:

1. Рассматриваете ли вы возможность использования random.randrange(…) с какой-либо дополнительной опцией numpy array?

Ответ №1:

Вы можете создать случайную положительную матрицу и умножить ее по элементам на случайный знак:

np.random.randint(1,6,(2,3))*np.random.choice([-1,1],(2,3))

Имейте в виду, что это работает только в том случае, если интервал равен примерно 0 , например (-6,6) ( 0 исключен).

Ответ №2:

Один из вариантов — просто «переназначить» значение 0 на одну из границ:

 import numpy as np

np.random.seed(100)
x = np.random.randint(-5, 5, (4, 8))
x[x == 0] = 5
print(x)
# [[ 3  3 -2  2  2 -5 -1 -3]
#  [ 5 -3 -3 -3 -4 -5  3 -1]
#  [-5  4  1 -3 -1 -4  5 -2]
#  [-1 -1 -2  2 -4 -4  2  2]]
  

Или вы можете использовать np.random.choice :

 import numpy as np

np.random.seed(100)
np.random.choice(list(range(-5, 0))   list(range(1, 6)), size=(4, 8))
print(x)
# [[ 3  3 -2  2  2 -5 -1 -3]
#  [ 5 -3 -3 -3 -4 -5  3 -1]
#  [-5  1 -3 -1 -4  5 -2 -1]
#  [-1 -2  2 -4 -4  2  2 -5]]
  

Комментарии:

1. Имейте в виду, что первое решение делает распределение неравномерным!

2. @fulaphex Делает это? Как так? Не все ли 10 значений имеют одинаковую вероятность выбора?

3. Извините, я неправильно истолковал границы функции randint. Но я думаю, что все еще есть ошибка, я думаю, что она должна быть x = np.random.randint(-5, 5, (4, 8)) . Из документов высокое значение на единицу выше самого большого целого числа, которое нужно нарисовать.

Ответ №3:

 np.random.choice(list(range(-5,0)) list(range(1,6)),(5,5))
  

или

 a = list(range(-5,6))
a.remove(0)
np.random.choice(a,(5,5))
  

Ответ №4:

 import numpy as np
a = np.arange(-5,6)
np.random.choice(list(numpy.select([a != 0, a == 0], [a, -1])),(5,5))
  

Это другой способ, с помощью которого вы можете определить свое собственное состояние списка. Вы можете исключить любое число из массива ‘a’, которое вы хотите, отредактировав условие. Выше для чисел, равных нулю, возвращают -1, а для чисел, не равных нулю, возвращают то же число.

Комментарии:

1. Спасибо, но это создает только случайное число между интервалами, но мне нужна матрица