编程语言
首页 > 编程语言> > 计算 – numpy python bug

计算 – numpy python bug

作者:互联网

我正在使用NumPy通过一个大盒子和一个小盒子之间的Aperture来寻找Y截距.我在大盒子里有超过100,000颗颗粒,在小盒子里有大约1000颗颗粒.这需要花费大量时间.所有self.YD,self.XD都是非常大的数组,我正在成倍增加.

PS:ind是需要乘以的值的索引.我的代码中该行之前有一个非零条件.

有什么想法我会以更简单的方式进行这种计算吗?

YD_zero = self.oldYD[ind] - ((self.oldYD[ind]-self.YD[ind]) * self.oldXD[ind])/(self.oldXD[ind]-self.XD[ind])

谢谢!

UPDATE

会使用乘法,除法,减法和Numpy的所有东西.让它更快?
或者,如果我分开计算.例如.

首先要这样做:

    YD_zero = self.oldYD[ind] - ((self.oldYD[ind]-self.YD[ind])*self.oldXD[ind])

然后下一行是:

    YD_zero /= (self.oldXD[ind]-self.XD[ind])

有什么建议?!

更新2

我一直试图解决这个问题,但现在还没有多少进展.我担心的是分母:

    self.oldXL[ind]-self.XL[ind] == 0

我得到了一些奇怪的结果.

另一件事是非零功能.我已经测试了一段时间了.任何人都可以告诉我它与Matlab中的find几乎相同

解决方法:

也许我得到了错误的结束,但在Numpy你可以执行矢量化计算.删除封闭的while循环,然后运行此…

YD_zero = self.oldYD – ((self.oldYD – self.YD)* self.oldXD)/(self.oldXD – self.XD)

它应该快得多.

更新:使用Newton-Raphson方法进行迭代根查找…

unconverged_mask = np.abs(f(y_vals)) > CONVERGENCE_VALUE:
while np.any(unconverged_mask):
    y_vals[unconverged_mask] = y_vals[unconverged_mask] - f(y_vals[unconverged_mask]) / f_prime(y_vals[unconverged_mask])
    unconverged_mask = np.abs(f(y_vals)) > CONVERGENCE_VALUE:

此代码仅是说明性的,但它显示了如何使用向量化代码将迭代过程应用于任何函数f,您可以找到f_prime的派生函数. unconverged_mask表示当前迭代的结果仅应用于尚未收敛的值.

请注意,在这种情况下,不需要迭代,Newton-Raphson将在第一次迭代中给出正确的答案,因为我们处理的是直线.你有什么是一个确切的解决方案.

第二次更新

好的,所以你没有使用Newton-Raphson.要一次性计算YD_zero(y截距​​),你可以使用,

YD_zero = YD(XD – X0)* dYdX

其中dYdX是渐变,在您的情况下,似乎是

dYdX =(YD – oldYD)/(XD – oldXD)

我假设XD和YD是粒子的当前x,y值,oldXD和oldYD是粒子的先前x,y值,X0是光圈的x值.

仍然不完全清楚为什么你必须遍历所有粒子,Numpy可以同时对所有粒子进行计算.

标签:python,numpy,matlab,bug-tracking
来源: https://codeday.me/bug/20190903/1795766.html