Трансляция нескольких массивов - PullRequest
0 голосов
/ 25 мая 2018

У меня есть следующая функция, которая генерирует двойной гауссов.

def Model(wavelength_array, width):
    """Returns the model
    Parameters: wavelength_array: Full wavelength array. This is a constant
                width: width of the Gaussians. This varies.
    """

    Gaussian = lambda x, mean, std: np.exp(-((x[:, np.newaxis] - mean)/std)**2)

    separation = (3729.875-3727.092)/2
    lambda0 = wavelength_array[:,(len(wavelength_array[0])+1)//2]

    models = []
    for i,j in enumerate(wavelength_array):
        models.append(Gaussian(j, lambda0[i]-separation, width) + \
                           Gaussian(j, lambda0[i]+separation, width))

    models = np.asarray(models)

    return models

wavelength_array - это массив массивов, а width это массив, например:

wavelength_array = [[4500, 4502, 4504, 4506] [4502, 4504, 4506, 4508]]
width = np.arange(.1, .5, .1)

Я бынравится перебирать каждый массив в wavelength_array и каждый элемент в width.Наивно это означало бы двойную петлю.Однако недавно я узнал о вещании и смог транслировать часть кода width.К сожалению, у меня все еще есть цикл, который повторяется по wavelength_array, и я не уверен, как я также могу транслировать по этой переменной.Если у вас есть какие-либо предложения и / или отзывы о том, как я могу полностью векторизовать эту функцию и ускорить ее, я был бы очень признателен.

1 Ответ

0 голосов
/ 25 мая 2018

Так что, возможно, я неправильно истолковал некоторые вещи, не стесняйтесь уточнить, и я исправлю.

В общем, вы пытаетесь получить набор гауссовских результатов, я лениво назову их нижеи верхний, затем сложите их вместе, чтобы получить один окончательный результат.Я также предполагаю, что значение lambda0 должно быть средним значением, а не вторым индексом.Если нет, не стесняйтесь игнорировать эту часть.

lambda0 = wavelength_array.mean(axis=1)
#so the broadcasting dimensionality will work
lambda0 = lambda0[:, np.newaxis]

Теперь вы сможете выполнять все операции в режиме вещания.

lower = np.exp(-((wavelength_array - (lambda0 - separation))/width)**2)
upper = np.exp(-((wavelength_array - (lambda0 + separation))/width)**2)

models = lower + uppper

Что-то в этом роде?

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