使列表中除以零等于零
Make division by zero equal to zero in a list
我有一个列表 L
,我想计算每个元素 const/L_j
并获得一个包含元素 M_j = const/L_j
的新列表 M
。但是,有 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)
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))
时间复杂度为 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]
执行此操作的最快、最简单和最 pythonic 的方法是数组掩码:
M = x / L
M[L == 0] = 0
这是一个比 fuglede 的代码更快的函数计算。
我有一个列表 L
,我想计算每个元素 const/L_j
并获得一个包含元素 M_j = const/L_j
的新列表 M
。但是,有 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)
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))
时间复杂度为 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]
执行此操作的最快、最简单和最 pythonic 的方法是数组掩码:
M = x / L
M[L == 0] = 0
这是一个比 fuglede 的代码更快的函数计算。