У меня есть код физической симуляции, написанный на python и использующий numpy/scipy. Профилирование кода показывает, что 38% времени процессора расходуется в одном двойном вложенном цикле - это кажется чрезмерным, поэтому я пытался его сократить.Создание массива индекса в numpy - исключение двойного цикла для цикла
Целью цикла является создание массива индексов, показывающих, какие элементы 1D-массива имеют элементы двумерного массива.
indices[i,j] = where(1D_array == 2D_array[i,j])
В качестве примера, если 1D_array = [7.2, 2.5, 3.9]
и
2D_array = [[7.2, 2.5]
[3.9, 7.2]]
Мы должны
indices = [[0, 1]
[2, 0]]
я в настоящее время это реализуется как
for i in range(ni):
for j in range(nj):
out[i, j] = (1D_array - 2D_array[i, j]).argmin()
argmin
необходимо, поскольку я имею дело с числами с плавающей запятой, и поэтому равенство не обязательно точное. Я знаю, что каждое число в массиве 1D уникально и каждый элемент в 2D-массиве имеет совпадение, поэтому этот подход дает правильный результат.
Есть ли способ устранить двойной цикл?
Примечание:
мне нужен массив индексов, чтобы выполнить следующую операцию:
f = complex_function(1D_array)
output = f[indices]
Это быстрее, чем альтернатива, так как 2D массив имеет размер NxN по сравнению с 1xN для 1D-массив, а 2D-массив имеет много повторяющихся значений. Если кто-то может предложить другой способ получить тот же результат, не пройдя через массив индексов, это также может быть решением
'1D_array' всегда сортируется? –
@AshwiniChaudhary, нет, это не так. На самом деле этого никогда не будет. Я отредактирую пример, чтобы удалить это. – Sten
Для этого я считаю, что записи в 1D_array не повторяются. Почему бы вам не сделать словарь из 1D_array, со значениями в качестве ключей и индексов в качестве значений? То есть '{0: 7.2, 1: 2.5, 2: 3.9}' Тогда вам просто нужно применить dict к массиву. – Roberto