Итак, если я правильно понимаю:
- вы хотите создать новый массив на основе
x
и y
, который имеет ту же длину, что и x
и y
,но для каждого элемента x
, если он меньше некоторого числа g
, это g
, в противном случае это совпадающее значение из y
с тем же индексом.
Решение:
import numpy as np
x = np.array([-34, 1, -12, 4, 5, -5])
y = np.array([2, -1, 4, 6, 7, 4])
g = -5
result = [g if ax < g else ay for ax, ay in zip(x, y)]
Обратите внимание, что:
zip()
берет две итерации и объединяет их в одну итерацию, объединяя значения из каждого входа. Таким образом, он принимает x
и y
и превращает их в [(-34, 2), (1, -1) и т. Д.] - цикл обработки списка по этим парам и выполняет операциюВы указали: если
ax
из x
меньше g
, результат включает g
, в противном случае он получает ay
из y
В качестве продолжения,ОП спросил, как найти g
, чтобы сумма result
была максимизирована (для отрицательных значений g
). Простой метод грубой силы:
import numpy as np
x = np.array([-34, 1, -12, 4, 5, -5])
y = np.array([2, -1, 4, 6, 7, 4])
prev_s = None
best_g = None
best_result = None
for g in range(min(x), 0):
values = [g if ax < g else ay for ax, ay in zip(x, y)]
s = sum(values)
if best_result is None or s > prev_s:
prev_s = s
best_g = g
best_result = values
print(best_g, best_result)
Обратите внимание, что для данных данного примера ответ на этот вопрос неинтересен 6, [6, 6, 6, 6, 6, 6]
. (Неинтересно, потому что вы можете постоянно увеличивать g
бесконечно, и результат всегда будет больше - ваш вопрос странно сформулирован)