Numpy除以0解决方法

eXi*_*nCe 5 python arrays numpy division

假设我有两个数组

x = [1,2,3]
y = [0,1,0]
Run Code Online (Sandbox Code Playgroud)

我需要按元素划分数组,因此使用numpy.我的问题是实施了"安全部门".做的时候:

np.divide(x,y).tolist()
Run Code Online (Sandbox Code Playgroud)

我得到输出:

[0.0, 2.0, 0.0]
Run Code Online (Sandbox Code Playgroud)

我的这个问题是我需要它来返回不为0时,除以0,使理想输出的元素:

[1.0, 2.0, 3.0]
Run Code Online (Sandbox Code Playgroud)

使用numpy有没有解决方法?手动定义一个函数来执行此操作,是否有任何优化的方法来执行此操作,而不进行自定义除法功能(如下所示)并在每对元素上使用它?

def mydiv(x, y):
if y == 0:
    return x
else:
    return x / y
Run Code Online (Sandbox Code Playgroud)

注意:我担心优化的原因是这将在云中运行,因此资源有限,并且当拥有300多个元素阵列时,这样做根本不是最佳的.

use*_*203 5

您可以使用一个简单的技巧:

\n\n
x / (y + (y==0))\n
Run Code Online (Sandbox Code Playgroud)\n\n

行动中:

\n\n
x = np.array([1, 5, 3, 7])\ny = np.array([0, 2, 0, 4])\n\nprint(x / (y + (y==0)))\n\n# [1.   2.5  3.   1.75]\n
Run Code Online (Sandbox Code Playgroud)\n\n

时间:

\n\n
def chrisz(x, y):\n  return x/(y+(y==0))\n\ndef coldspeed1(x, y):\n  m = y != 0\n  x[m] /= y[m]\n  return x\n\ndef coldspeed2(x, y):\n  m = ~(y == 0)\n  x[m] /= y[m]\n  return x\n\ndef coldspeed3(x, y):\n  m = np.flatnonzero(y)\n  x[m] /= y[m]\n  return x\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:

\n\n
In [33]: x = np.random.randint(10, size=10000).astype(float)\n\nIn [34]: y = np.random.randint(3, size=10000).astype(float)\n\nIn [35]: %timeit chrisz(x, y)\n29.4 \xc2\xb5s \xc2\xb1 601 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000 loops each)\n\nIn [36]: %timeit coldspeed1(x, y)\n173 \xc2\xb5s \xc2\xb1 2 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000 loops each)\n\nIn [37]: %timeit coldspeed2(x, y)\n184 \xc2\xb5s \xc2\xb1 1.36 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000 loops each)\n\nIn [38]: %timeit coldspeed3(x, y)\n179 \xc2\xb5s \xc2\xb1 2.68 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n