Как я могу создать мозаичный / сложенный массив, основанный на диапазонах, используя эти 2 входных массива - но без зацикливания? - PullRequest
1 голос
/ 24 апреля 2020

Моя основная проблема c заключается в том, что мне нужно использовать 2 массива с целыми числами и получить комбинированный массив, представляющий собой комбинацию многих диапазонов, созданных с использованием попарных комбинаций из 2 исходных массивов.

Сказал немного по-другому, я хочу использовать 2 массива, объединить их для получения набора диапазонов, а затем объединить эти диапазоны вместе. Важно отметить, что мне нужно сделать это без использования циклов, так как я собираюсь сделать это почти 4 миллиона раз.

Мои 2 начальных массива:

import numpy as np
sd = np.array([3,3,4,2,5,1])   # StartDate
ed = np.array([4,5,5,5,8,2])   # EndDate

Попарно, они будет выглядеть следующим образом, комбинируя (sd [i] с ed [i]):

[(3, 4), (3, 5), (4, 5), (2, 5), (5, 8), (1, 2)]   # Pairwise combinations of StartDate and EndDate

В качестве примера, я мог бы итерировать по этим парам, создавая диапазоны, примеры ниже :

[In]: range1 = np.arange(3,4)
[Out]: array([3])
[In]: range2 = np.arange(3,5)
[Out]: array([3,4])

... и так далее, чтобы получить окончательный результат, который будет:

array([3, 3, 4, 4, 2, 3, 4, 5, 6, 7, 1])  # End result where the arrays are tiled after one another 
#(note first 3 digits are array 1 and array 2 from immediately above.

Моя проблема в том, что мне нужно go от ввода массивы и выходной массив без зацикливания, как я уже пробовал версию этого, и это слишком медленно. Любая помощь очень ценится.

1 Ответ

0 голосов
/ 24 апреля 2020

Вам повезло. Вот решение с одним вкладышем:

indexer = np.r_[tuple([np.s_[i:j] for (i,j) in zip(sd,ed)])]

выход:

[3 3 4 4 2 3 4 5 6 7 1]

Я также объяснил аналогичный случай здесь для факела : " Вот как это работает:

np.s_ [i: j] создает объект среза (просто диапазон) индексов от начала = i до конца = j.

np.r_ [i: j, k: m] создает список ВСЕХ индексов в срезах (i, j) и (k, m) (Вы можете передать большее количество срезов в np.r_, чтобы объединить их все сразу. Это пример объединяет только два среза.)

Следовательно, индексатор создает список ВСЕХ индексов, объединяя список срезов (каждый срез является диапазоном индексов). "

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