Векторизованное суммирование с отсутствующими элементами - PullRequest
2 голосов
/ 20 апреля 2020

I sh для решения следующей суммы s, которая определяется поэлементно:

enter image description here

, где элементы z и lambda имеют сложный тип, а N является вещественным и длину векторов. Это можно сделать в al oop, хотя это неэффективно. Вот моё решение:

import numpy as np

N = 10
z = np.random.rand(N)
lamb = np.random.rand(N)

s = []
indexs = np.arange(N)

for idx in indexs:

    summand = np.sum(1/(z[idx] - lamb[indexs[indexs!=idx]]))

    s.append(summand/N)

s = np.array(s)

Кто-нибудь может указать мне направление полного numpy решения?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вы можете вычесть lamb с широковещательной рассылкой, создав таким образом массив в форме (len(z),len(lamb)), а затем установить его диагональные записи на 0 с fill_diagonal, чтобы они удовлетворяли lamb[indexs[indexs!=idx]] и sum вдоль второй оси:

out = z[:,None]-lamb
np.fill_diagonal(out, 0)
out = (1/out).sum(1)/N
1 голос
/ 20 апреля 2020
import numpy as np

N = 10
z = np.random.rand(N)
lamb = np.random.rand(N)
ss = 1 / np.subtract.outer(z, lamb)
np.fill_diagonal(ss, 0)
ss = ss.sum(axis=1) / N
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...