Numpy 除以 0 解决方法
Numpy division by 0 workaround
假设我有两个数组
x = [1,2,3]
y = [0,1,0]
我需要按元素划分数组,因此使用了 numpy。
我的问题是实施了 "secure division"。
做的时候:
np.divide(x,y).tolist()
我得到输出:
[0.0, 2.0, 0.0]
我的问题是我需要它 return 除以 0 时不为 0 的元素,得到理想的输出:
[1.0, 2.0, 3.0]
是否有任何解决方法可以使用 numpy 执行此操作?
手动定义一个函数来执行此操作,是否有任何优化的方法来执行此操作,而无需制作自定义除法函数(如下所示)并在每对元素上使用它?
def mydiv(x, y):
if y == 0:
return x
else:
return x / y
注意:我担心优化的原因是这将 运行 在云端,所以资源有限,当有 300 多个元素数组时,这样做似乎根本不是最佳选择。
执行此操作的 easiest/fastest 方法是仅除以对应于非零 y-val 的值。
x = [1, 2, 3]
y = [0, 1, 0]
x, y = [np.array(arr, dtype=float) for arr in (x, y)]
m = y != 0 # ~(y == 0) # np.flatnonzero(y)
x[m] /= y[m]
print(x)
array([1., 2., 3.])
您可以使用的一个简单技巧:
x / (y + (y==0))
进行中:
x = np.array([1, 5, 3, 7])
y = np.array([0, 2, 0, 4])
print(x / (y + (y==0)))
# [1. 2.5 3. 1.75]
时间安排:
def chrisz(x, y):
return x/(y+(y==0))
def coldspeed1(x, y):
m = y != 0
x[m] /= y[m]
return x
def coldspeed2(x, y):
m = ~(y == 0)
x[m] /= y[m]
return x
def coldspeed3(x, y):
m = np.flatnonzero(y)
x[m] /= y[m]
return x
结果:
In [33]: x = np.random.randint(10, size=10000).astype(float)
In [34]: y = np.random.randint(3, size=10000).astype(float)
In [35]: %timeit chrisz(x, y)
29.4 µs ± 601 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [36]: %timeit coldspeed1(x, y)
173 µs ± 2 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [37]: %timeit coldspeed2(x, y)
184 µs ± 1.36 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [38]: %timeit coldspeed3(x, y)
179 µs ± 2.68 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
假设我有两个数组
x = [1,2,3]
y = [0,1,0]
我需要按元素划分数组,因此使用了 numpy。 我的问题是实施了 "secure division"。 做的时候:
np.divide(x,y).tolist()
我得到输出:
[0.0, 2.0, 0.0]
我的问题是我需要它 return 除以 0 时不为 0 的元素,得到理想的输出:
[1.0, 2.0, 3.0]
是否有任何解决方法可以使用 numpy 执行此操作? 手动定义一个函数来执行此操作,是否有任何优化的方法来执行此操作,而无需制作自定义除法函数(如下所示)并在每对元素上使用它?
def mydiv(x, y):
if y == 0:
return x
else:
return x / y
注意:我担心优化的原因是这将 运行 在云端,所以资源有限,当有 300 多个元素数组时,这样做似乎根本不是最佳选择。
执行此操作的 easiest/fastest 方法是仅除以对应于非零 y-val 的值。
x = [1, 2, 3]
y = [0, 1, 0]
x, y = [np.array(arr, dtype=float) for arr in (x, y)]
m = y != 0 # ~(y == 0) # np.flatnonzero(y)
x[m] /= y[m]
print(x)
array([1., 2., 3.])
您可以使用的一个简单技巧:
x / (y + (y==0))
进行中:
x = np.array([1, 5, 3, 7])
y = np.array([0, 2, 0, 4])
print(x / (y + (y==0)))
# [1. 2.5 3. 1.75]
时间安排:
def chrisz(x, y):
return x/(y+(y==0))
def coldspeed1(x, y):
m = y != 0
x[m] /= y[m]
return x
def coldspeed2(x, y):
m = ~(y == 0)
x[m] /= y[m]
return x
def coldspeed3(x, y):
m = np.flatnonzero(y)
x[m] /= y[m]
return x
结果:
In [33]: x = np.random.randint(10, size=10000).astype(float)
In [34]: y = np.random.randint(3, size=10000).astype(float)
In [35]: %timeit chrisz(x, y)
29.4 µs ± 601 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [36]: %timeit coldspeed1(x, y)
173 µs ± 2 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [37]: %timeit coldspeed2(x, y)
184 µs ± 1.36 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [38]: %timeit coldspeed3(x, y)
179 µs ± 2.68 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)