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

#arrays #numpy

#массивы #numpy

Вопрос:

Рассмотрим следующий фрагмент кода:

 import numpy as np

mask = np.array([True, True, False, True, True, False])
val = np.array([9, 3])
arr = np.random.randint(1, 9, size = (5,len(mask)))
  

Как и ожидалось, мы получаем массив случайных целых чисел от 1 до 9 с 5 строками и 6 столбцами, как показано ниже. val Массив еще не использовался.

 [[2, 7, 6, 9, 7, 5],
 [7, 2, 9, 7, 8, 3],
 [9, 1, 3, 5, 7, 3],
 [5, 7, 4, 4, 5, 2],
 [7, 7, 9, 6, 9, 8]]
  

Теперь я представлю val = [9, 3] .
Где mask = True я хочу, чтобы элемент строки выбирался случайным образом от 1 до 9.
Где mask = False я хочу, чтобы элемент строки выбирался случайным образом от 1 до 3.

Как это можно сделать эффективно? Пример вывода показан ниже.

 [[2, 7, 2, 9, 7, 1],
 [7, 2, 1, 7, 8, 3],
 [9, 1, 3, 5, 7, 3],
 [5, 7, 1, 4, 5, 2],
 [7, 7, 2, 6, 9, 1]]
  

Ответ №1:

Одна из идей состоит в том, чтобы произвольно выбирать от 0 до 1, затем умножать на 9 или 3 в зависимости от mask и, наконец, добавлять 1 для перемещения выборки.

 rand = np.random.rand(5,len(mask))
is3 = (1-mask).astype(int)

# out is random from 0-8 or 0-2 depending on `is3`
out = (rand*val[is3]).astype(int)

# move out by `1`:
out = (out   1)
  

Вывод:

 array([[4, 9, 3, 6, 2, 1],
       [1, 8, 2, 7, 1, 3],
       [8, 2, 1, 2, 3, 2],
       [4, 3, 2, 2, 3, 2],
       [5, 8, 1, 5, 6, 1]])
  

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

1. Очень полезная информация, которую я могу использовать в других местах!