使用CuPy替代Numpy求多项式根时遇AttributeError报错求助
CuPy roots函数报错AttributeError的解决办法
问题原因
Numpy的roots函数支持直接传入Python列表并自动转换为Numpy数组,但CuPy的roots函数要求输入必须是CuPy数组,不能直接处理Python列表。你的代码中coef是Python列表,调用cp.roots(coef)时,函数会尝试访问列表的dtype属性,而列表没有这个属性,因此触发AttributeError。
解决步骤
在调用cp.roots前,将系数列表转换为CuPy数组即可,具体修改如下:
修改后的代码
def root3(xe, ye, xp, yp, cs, c3): # Get the roots of a polynomial nu = (c3/cs)**2 A = ye**2 B = yp**2 C4 = nu - 1 C3 = (-2*xp - 2*xe) * C4 C2 = nu*B - A + (xe**2 + xp**2 + 4*xe*xp) * C4 C1 = -2 * nu * B * xe + 2 * A * xp + (-2 * xp * xe**2 - 2*xe*xp**2) * C4 C = nu * B * xe**2 - A * xp**2 + (xe**2 * xp**2)*C4 coef = [C4, C3, C2, C1, C] # 关键:将Python列表转为CuPy数组 coef = cp.array(coef) R = cp.roots(coef) return R[cp.isreal(R)]
额外注意
如果xe、ye等输入参数是Numpy数组,建议先转为CuPy数组(使用cp.asarray(xe)),这样所有中间计算都会在CuPy中进行,避免Numpy和CuPy数组混合导致的性能损耗或潜在问题。
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

