Работа с двумя массивами для заполнения третьего в numpy - PullRequest
2 голосов
/ 23 января 2020

Я пытаюсь определенным образом работать с двумя массивами в python. Допустим,

A = np.array([5, 10, 30, 50])
B = np.array([2, 3, 4, 5])

Теперь у меня есть целевой массив C = [2, 7, 15, 25, 40]. Я хочу найти выходное значение (скажем, Y) для каждого элемента в C (скажем, x) с условиями:

  • Если x < A[0], тогда Y = B[0]
  • Если A[i] < x < 2*A[i] < A[i+1] или A[i] < x < A[i+1] < 2*A[i], то Y=x
  • Если A[i] < 2*A[i] < x < A[i+1], то Y = B[i+1]
  • Если x > A[end], то Y = x

i - максимально возможный индекс, удовлетворяющий условиям

Итак, вывод становится Y = [2, 7, 15, 4, 40]

Это то, что у меня сейчас

A = np.array([5, 10, 30, 50])
B = np.array([2, 3, 4, 5])
C = np.array([2, 7, 15, 25, 40])

diffA = np.diff(A)

diffIdx = np.squeeze(np.where(diffA > A[0:len(A)-1]+1e-6))

Y = np.array([])

for x in C:
  idx = np.searchsorted(A, x)
  if idx == 0:
    Y = np.append(Y, B[0])
  elif np.any(diffIdx==idx-1) & (x>2*A[idx-1]+1e-6):
    Y = np.append(Y, B[idx])
  else:
    Y = np.append(Y, x)

Это похоже на работу и я Python консоль %timeit показывает, что это занимает 24.7 ms, но мне было интересно, есть ли лучший или более быстрый способ сделать то же самое.

1 Ответ

1 голос
/ 23 января 2020

Проверьте этот вопрос Самый эффективный способ сопоставить функцию с numpy массивом . Вы можете создать массив индексов np.arange(C.size), создать функцию со всеми логиками c из объединения элементов A, B и C, получая их по индексу и в зависимости от размера ваших массивов выбирайте самый быстрый метод применения функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...