Вы захотите использовать массивы Numpy (если вы этого еще не сделали) для хранения ваших данных. Затем вы можете воспользоваться вещанием массива с np.newaxis
. Для каждого значения в wav
вы хотите вычислить разницу между этим значением и каждым значением в laser_wav
. Это говорит о том, что вам понадобится двумерный массив с двумя измерениями: wav
и laser
.
В приведенном ниже примере я выберу первый индекс как индекс laser
, а второй индекс как индекс wav
. С примерами данных это становится:
import numpy as np
LASER_LEN = 5
WAV_LEN = 10
laser_flux = np.arange(LASER_LEN)
wav = np.arange(WAV_LEN)
laser_wav = np.array(LASER_LEN)
# Tile wav into LASER_LEN rows and tile laser_wav into WAV_LEN columns
diff = wav[np.newaxis,:] - laser_wav[:,np.newaxis]
exp_arg = -diff ** 2
sum_arg = laser_flux[:,np.newaxis] * np.exp(exp_arg)
# Now, the resulting array sum_arg should be of size (LASER_LEN,WAV_LEN)
# Since your original sum was along each element of laser_flux/laser_wav,
# you'll need to sum along the first axis.
result = np.sum(sum_arg, axis=0)
Конечно, вы можете просто сжать это в одно утверждение:
result = np.sum(laser_flux[:,np.newaxis] *
np.exp(-(wav[np.newaxis,:]-laser_wav[:,np.newaxis])**2),axis=0)
Edit:
Как отмечено в комментариях к вопросу, вы можете воспользоваться «суммой умножений», присущей определению умножений в стиле линейной алгебры. Это становится:
result = np.dot(laser_flux,
np.exp(-(wav[np.newaxis,:] - laser_wav[:,np.newaxis])**2))