Числовой случайный массив ограничен другими массивами - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть два nundy ndarrays с одинаковыми размерами.

a = np.random.randn(x,y)
b = np.random.randn(x,y)

Я хочу создать новый массив, где каждый элемент будет случайным значением между значениями элементов с одинаковыми индексами в a и b.Таким образом, каждый элемент c[i][j] должен быть между a[i][j] и b[i][j].Есть ли более быстрый / простой / более эффективный способ, чем пройти через все элементы c и назначить случайные значения?

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

Вот идея использования numpy:

a = np.random.randn(2,5)
array([[ 1.56068748, -2.21431346],
       [-0.33707115,  0.93420256]])

b = np.random.randn(2,5)
array([[-0.0522846 ,  0.11635731],
       [-0.57028069, -1.08307492]])

# Create an interleaved array from both a and b 
s = np.vstack((a.ravel(),b.ravel()))

array([[ 1.56068748, -2.21431346, -0.33707115,  0.93420256],
       [-0.0522846 ,  0.11635731, -0.57028069, -1.08307492]])

# Feed it to `np.random.uniform` which takes low and high as inputs 
# and reshape it to match input shape
np.random.uniform(*s).reshape(a.shape)

array([[ 0.14467235, -0.79804187],
       [-0.41495614, -0.19177284]])
0 голосов
/ 03 февраля 2019

Вы можете сделать это:

c=a+(b-a)*d

с d = случайным массивом со значениями от 0 до 1 в тех же измерениях, что и

0 голосов
/ 03 февраля 2019

Вы можете использовать numpy.random.uniform , из документации:

low: float или array_like из float, необязательно

Нижняя границавыходной интервал.Все сгенерированные значения будут больше или равны низким.Значение по умолчанию: 0.

high: float или array_like of floats

Верхняя граница выходного интервала.Все сгенерированные значения будут меньше высоких.Значение по умолчанию - 1,0.

Так что и low, и high могут получать массивы в качестве параметров, для полноты см. Код ниже:

Код:

import numpy as np

x, y = 5, 5

a = np.random.randn(x, y)
b = np.random.randn(x, y)

high = np.maximum(a, b)
low = np.minimum(a, b)

c = np.random.uniform(low, high, (x, y))

print((low <= c).all() and (c <= high).all())

Выход

True

В приведенном выше примере обратите внимание на использование максимум и минимум для построения high и low.Последняя строка проверяет, что действительно все значения c находятся между high и low.Вы можете сделать все это в одну строку, если это вас интересует:

c = np.random.uniform(np.minimum(a, b), np.maximum(a, b), (x, y))
...