Сделать деление на ноль равным нулю в списке - PullRequest
0 голосов
/ 10 июня 2018

У меня есть список L, и я хочу вычислить для каждого элемента const/L_j и получить новый список M с элементами M_j = const/L_j.Однако есть L_j элементов, которые равны нулю.В этом случае предпочтительнее присвоить такое деление нулю.Я сделал это сценарием ниже, но он медленный.

temp = np.zeros((self.n_features, 1))
for t in range(self.n_features):
    if y[t]!=0:
        temp[t] = x/y[t] 

Мой вопрос похож на этот, но я хочу применить его в списке.Это более быстрый способ вычисления списка M.

Спасибо.

Ответы [ 5 ]

0 голосов
/ 10 июня 2018

Самый быстрый, самый простой и самый питонический способ сделать это - маскирование массива:

M = x / L
M[L == 0] = 0

Это вычисление одной функции быстрее, чем кода fuglede.

0 голосов
/ 10 июня 2018

Вы можете сделать это, используя math.inf.

from math import inf

lst = [2, 1, 0, -1, -2]
const = 1

res = [const / (l or inf) for l in lst]

print(res) # [0.5, 1.0, 0.0, -1.0, -0.5]
0 голосов
/ 10 июня 2018
def transform_to_M(const, x):
    if x==0:
       return 0
    return const/x

np.fromiter((transform_to_M(const, i) for i in y), float, count=len(y))
0 голосов
/ 10 июня 2018

Просто еще один способ с временной сложностью O(N), итерации по элементам:

M = [0 if l == 0 else constant/l for l in L]
0 голосов
/ 10 июня 2018

Предполагая, что ваш массив называется L, вы можете сделать что-то вроде

M = x/L
M[np.isinf(M)] = 0

Дополнительное время, необходимое для обнуления плохих элементов, ничтожно, даже когда число бесконечностей велико:

In [20]: L = np.random.randint(0, 2, 100000)

In [21]: %timeit [0 if l == 0 else 10/l for l in L]
34.9 ms ± 2.03 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [23]: %timeit M = 10/L
263 µs ± 11.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [24]: %timeit M[np.isinf(M)] = 0
983 ns ± 40.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
...