Как numpy-ify двумерный условный поиск?

Я пытаюсь векторизовать или иным образом ускорить (вероятно, используя 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.

Любые идеи/указатели? Спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать логическую маску для индексации 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].

Другие вопросы по теме