Python 使列表中的除零等于零

Python 使列表中的除零等于零,python,numpy,divide-by-zero,Python,Numpy,Divide By Zero,我有一个列表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的更快方法

我有一个列表
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
的更快方法吗


谢谢。

假设您的数组名为
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)

另一种时间复杂度为
O(N)
,迭代元素:

M = [0 if l == 0 else constant/l for l in L]

您可以使用
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]

实现这一点的最快、最简单和最具python风格的方法是阵列掩蔽:

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

这是一个比fuglede的代码更快的函数计算。

没有计算速度更快的方法来计算此列表。计算每个元素最多只能进行一次访问,不能少。@NiVeR:NumPy的目的是通过矢量化来精确地加速这些计算;在这种情况下,这样做比朴素的循环解决方案快几个数量级;矢量化的解决方案也将是线性时间,但常数的数量级更小。@fuglede你完全正确,关键是它只需在数据上进行1次迭代即可完成(无系数)。
M = x / L
M[L == 0] = 0