gpt4 book ai didi

python - 计算 - numpy python 错误

转载 作者:太空宇宙 更新时间:2023-11-03 14:33:17 25 4
gpt4 key购买 nike

我正在使用 NumPy 通过大盒子和小盒子之间的孔径来计算 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])

谢谢!

更新

会使用 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)

我假设 XDYD 是粒子的当前 x,y 值,oldXDoldYD 是粒子先前的 x,y 值,X0 是孔径的 x 值。

仍然不完全清楚为什么要遍历所有粒子,Numpy 可以一次对所有粒子进行计算。

关于python - 计算 - numpy python 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6765001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com