广播多个阵列

时间:2018-05-24 21:21:51

标签: python numpy numpy-broadcasting

我有以下函数生成双高斯。

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 :(得分:0)

所以我可能误解了一些事情,随意澄清并且我会纠正。

一般情况下,您试图获得一组高斯结果,我会懒洋洋地将它们称为低位和高位,然后将它们加在一起以获得最终结果。我还假设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

那样的东西?