Я нахожусь в одном из тех странных мест, где я точно знаю, что хочу делать. Я мог бы легко закодировать его, используя циклы for. но я пытаюсь выучить Numpy и не могу сформулировать, как решить эту проблему в Numpy.
Я хочу иметь 2-мерный массив или пространство параметров. Все значения от 1200 до 1800 и все их комбинации. Итак, [1200, 1200], [1200, 1201], [1200, 1202] .... [1201, 1200], [1201, 1201] и т.д. c.
Я хочу применить функцию по всему этому пространству параметров. Функция использует еще 2 массива, которые также являются значениями в диапазоне 1200-1800. Но это случайные значения, поэтому эти 2 дополнительных массива представляют собой случайные значения в диапазоне 1200-1800, так что [1356, 1689, 1436, ...] и [1768, 1495, 1358, ...] и c. check_array1 и check_array2.
Функция должна перемещаться по пространству параметров, проверяя условие, которое в основном if x < check_array1 and y < check_array2 then 1 else 0
. Где x и y - каждая из указанных c точек в 2-м пространстве параметров. Ему необходимо проверить каждую комбинацию значений в проверочных массивах. Суммируйте сумму, сравните с другим значением c и верните разницу.
Каждая уникальная комбинация в сетке пространства параметров будет иметь уникальное значение, связанное с ней, в зависимости от того, как эти параметры c Значения x и y из пространства параметров сравниваются с двумя контрольными массивами.
Надеюсь, что это делает, я просто не могу понять, как превратить это в Numpy дружественную проблему. Извините за стену текста.
Изменить: я написал его на более базовом c Python, чтобы лучше проиллюстрировать то, что я пытаюсь сделать.
check1 = np.random.randint(1200, 1801, 300)
check2 = np.random.randint(1200, 1801, 300)
def check_this_double(i, j, check1, check2):
total = 0
for num in range(0, len(check1)):
if ((i < check1[num]) or (j < check2[num])):
total += 1
return total
outputs = {}
for i in range(1200, 1801):
for j in range(1200, 1801):
outputs[i,j] = check_this_double(i, j, check1, check2)
Изменить 2: Я верю, что у меня это есть. Следуя коду Горы, создавая p_space, а затем используя np.vectorize в обычном Python fuction.
check1 = np.random.randint(1200, 1801, 300)
check2 = np.random.randint(1200, 1801, 300)
def calc(i, j):
total = np.where(np.logical_or(check1 < i, checks2 < j), 1, 0)
return total.sum()
rate_calv_v = np.vectorize(rate_calc)
final = rate_calv_v(p_space[:, 0], p_space[:, 1])
Похоже на читерство :), должен быть способ сделать это без np.vectorize. Но мне кажется, это работает.