计算numpython错误

2024-10-03 02:32:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我用NumPy来计算Y截距,通过一个大盒子和一个小盒子之间的缝隙。大盒子里有超过10万个粒子,小盒子里有1000个粒子。这需要很多时间。所有的自我.YD, 自我.XD是非常大的数组。在

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

你知道我怎样用更简单的方法来计算吗?在

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

谢谢!在

更新

会用乘法,除法,减法和所有的Numpy。快一点? 或者如果我分开计算。例如。在

要先执行此操作:

^{pr2}$

下一行是:

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

有什么建议吗?!在

更新2

我一直在努力想办法解决这个问题,但进展不大。我担心的是分母:

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

我得到了一些奇怪的结果。在

另一个是非零函数。我已经测试了一段时间了。有人能告诉我,它几乎和在Matlab中找到的一样吗


Tags: 代码selfnumpy时间粒子数组盒子ps
3条回答

也许我弄错了,但在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将在第一次迭代中给出正确答案,因为我们处理的是直线。你得到的是一个精确的解。

第二次更新

好吧,你没有用牛顿·拉斐逊。要一次性计算YD_zero(y截距),可以使用

YD_zero = YD + (XD - X0) * dYdX

其中dYdX是梯度,在你的例子中

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

我假设XDYD是粒子的当前x,y值,oldXD和{}是粒子先前的x,y值,X0是光圈的x值。在

仍然不完全清楚为什么要迭代所有粒子,Numpy可以一次计算所有粒子。在

由于所有的计算都是按元素进行的,所以在^{}中重新编写表达式应该很容易。这将避免在执行oldYD-YD等操作时创建的所有非常大的临时数组。在

另一种可能是^{}。在

我肯定会选择numexpr。我不确定numexpr是否可以处理索引,但我敢打赌以下(或类似的)方法会起作用:

import numexpr as ne

yold = self.oldYD[ind]
y = self.YD[ind]
xold = self.oldXD[ind]
x = self.XD[ind]
YD_zero = ne.evaluate("yold - ((yold - y) * xold)/(xold - x)")

相关问题 更多 >