我用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中找到的一样吗
也许我弄错了,但在Numpy中,你可以执行向量化计算。删除封闭的
while
循环,然后运行这个。。。在YD_zero = self.oldYD - ((self.oldYD - self.YD) * self.oldXD) / (self.oldXD - self.XD)
应该快得多。在
更新:使用Newton-Raphson方法迭代求根。。。在
这段代码只是说明性的,但是它展示了如何使用向量化代码对任何函数
f
应用迭代过程,您可以找到f_prime
的导数。unconverged_mask
表示当前迭代的结果将只应用于那些尚未收敛的值。在注意,在这种情况下不需要迭代,Newton Raphson将在第一次迭代中给出正确答案,因为我们处理的是直线。你得到的是一个精确的解。
第二次更新
好吧,你没有用牛顿·拉斐逊。要一次性计算
YD_zero
(y截距),可以使用YD_zero = YD + (XD - X0) * dYdX
其中
dYdX
是梯度,在你的例子中dYdX = (YD - oldYD) / (XD - oldXD)
我假设}是粒子先前的x,y值,
XD
和YD
是粒子的当前x,y值,oldXD
和{X0
是光圈的x值。在仍然不完全清楚为什么要迭代所有粒子,Numpy可以一次计算所有粒子。在
由于所有的计算都是按元素进行的,所以在^{} 中重新编写表达式应该很容易。这将避免在执行
oldYD-YD
等操作时创建的所有非常大的临时数组。在另一种可能是^{} 。在
我肯定会选择
numexpr
。我不确定numexpr
是否可以处理索引,但我敢打赌以下(或类似的)方法会起作用:相关问题 更多 >
编程相关推荐