Использование Numpy вместо петель - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть следующие фиктивные данные:

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]

Моя проблема в том, что я хочу использовать Numpy (final) для эмуляции цикла, видимого в final2, из-за скорости при получении больших массивов и прочего. Но вывод не тот, и я пробовал разные вещи, но я просто не могу понять, как это сделать, и если это вообще возможно?

Выход final:

[275.3622303   16.59404201  16.59404201]    

Где это должно быть, как в final2:

[6.7290539608469775, 7.0, 7.0]

Может быть, я ослепну от этого, но я просто не смог понять, как это сделать.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Просто используя массив непосредственно в том же выражении и суммируя по первой оси -

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
0 голосов
/ 05 сентября 2018

Вы можете сделать это с помощью трансляции:

np.sum(
    (x[None, :] ** (1 / n_values[:, None])) * (y[None, :] / tot_value),
    axis=1
) ** n_values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...