Добавление значений из одного массива, если значение в другом массиве больше определенного значения, в противном случае добавьте это значение - PullRequest
0 голосов
/ 08 октября 2019

Скажем, например, у меня есть два массива одинаковой длины.

x = np.array([-34, 1, -12, 4, 5, -5])

y = np.array([2, -1, 4, 6, 7, 4])

Я хочу создать новый массив или список равной длины, где, если значение x меньше определенного числа (г)затем он добавляет (g), иначе он будет добавлять y.

Так что в двух приведенных выше массивах скажем, что если x меньше -5, он добавит -5, в противном случае он добавит значение y. Получилось бы следующее:

new_array = ([-5, -1, -5, 6, 7, 4])

Ответы [ 3 ]

2 голосов
/ 08 октября 2019

Вы можете сделать это просто с помощью np.where, например:

In []:
np.where(x < -5, -5, y)

Out[]:
array([-5, -1, -5,  6,  7,  4])
1 голос
/ 08 октября 2019

Итак, если я правильно понимаю:

  • вы хотите создать новый массив на основе 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 бесконечно, и результат всегда будет больше - ваш вопрос странно сформулирован)

0 голосов
/ 08 октября 2019

Ключ заключается в том, чтобы перебирать каждый элемент в массиве x на основе его индекса. Если элемент в x не меньше чем -5, вы можете легко ссылаться на тот же элемент в y, используя тот же индекс, что и для x.

import numpy as np

x = np.array([-34, 1, -12, 4, 5, -5])
y = np.array([2, -1, 4, 6, 7, 4])
newList = []
number = -5
for i in range(len(x)):
  if x[i] < number:
    newList.append(number)
  else:
    newList.append(y[i])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...