使用Numpy代替循环

时间:2018-09-05 12:15:37

标签: python numpy vectorization

我有以下虚拟数据:

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions
    {
        ClientId = clientId,
        Authority = authority,
        PostLogoutRedirectUri = postLogoutRedirectUri,
        Scope = "openid profile email roles"
    });

我的问题是由于要获取更大的数组和其他内容,所以由于速度原因,我想使用Numpy(import numpy as numpy x = np.linspace(1, 10, 10) y = np.linspace(1, 10, 10) x[::-1].sort() y[::-1].sort() tot_value = np.sum(y) n_values = np.array([1, 2, 3]) final = np.sum((x[:, np.newaxis]**(1/n_values))*(y[:, np.newaxis]/tot_value))**n_values final2 = [np.sum((x[:, np.newaxis]**(1/i))*(y[:, np.newaxis]/tot_value))**i for i in n_values] )来模拟final中看到的循环。但是输出是不一样的,我一直在尝试不同的东西,但是我似乎无法弄清楚该怎么做,甚至可能吗?

final2的输出是:

final

应位于[275.3622303 16.59404201 16.59404201] 中的位置:

final2

也许我对此一无所知,但我只是看不到该怎么做。

2 个答案:

答案 0 :(得分:2)

直接将数组直接用于相同的表达式并沿第一个轴求和-

i = n_values
out = np.sum((x[:, np.newaxis]**(1/i))*(y[:, np.newaxis]/tot_value),axis=0)**i

使用einsum的另一位和一位表现更好的人-

out = np.einsum('ij,ij->j',x[:, np.newaxis]**(1/i),y[:, np.newaxis]/tot_value)**i

matrix-multiplication还有更多-

out = (y/tot_value).dot(x[:, np.newaxis]**(1/i))**i

答案 1 :(得分:1)

您可以使用广播来做到这一点:

np.sum(
    (x[None, :] ** (1 / n_values[:, None])) * (y[None, :] / tot_value),
    axis=1
) ** n_values