Я пытаюсь векторизовать или иным образом ускорить (вероятно, используя numpy) цикл поиска/сопоставления. Я изучил np.vectorize
, индексацию numpy и np.where
, но не могу найти правильную реализацию/комбинацию, соответствующую моим потребностям.
Код в вопросе:
Sx = np.zeros((Np+1, 2*N+1))
rows, cols = prepped_array.shape[0], prepped_array.shape[1]
for ind1 in range(rows):
for ind2 in range(cols):
if prepped_array[ind1][ind2][0] != -1:
Sx[ind1, ind2] = M[prepped_array[ind1][ind2][0], prepped_array[ind1][ind2][1]]
prepped_array
— это таблица поиска (инициализированная для всех [-1, -1]
), в которой значения были заменены там, где они должны быть изменены в Sx
.
M
— это преобразованный ввод, который мы хотим отобразить в массив Sx
.
Любые идеи/указатели? Спасибо!
Вы можете использовать логическую маску для индексации Sx
и prepped_array
, а затем использовать два массива индексов, полученных из prepped_array
, для индексации в массив M
. Код может говорить яснее, чем предыдущее предложение:
mask = prepped_array[:, :, 0] != -1
Sx[mask] = M[tuple(prepped_array[mask].T)]
Давайте посмотрим на вовлеченные шаги:
mask = prepped_array[:, :, 0] != -1
создает двумерный логический массив, указывающий, где выполняется условие.prepped_array[mask]
создает 2D-массив, в котором записи из предыдущих 3-х измерений теперь появляются вдоль 2-го измерения; первые измерения соответствуют каждому экземпляру True
в mask
.tuple(prepped_array[mask].T)
создает два одномерных массива, которые можно использовать для дальнейшего индексирования в другие массивы: первый массив обозначает индексы строк, а второй массив обозначает индексы столбцов.Sx[mask] = M[tuple(prepped_array[mask].T)]
сопоставляет индексы, содержащиеся в prepped_array
, с массивом M
, используя два предыдущих массива одномерных индексов.Sx[mask]
, наконец, ссылается на те элементы в Sx
, для которых выполняется условие в prepped_array[:, :, 0]
.