如何解决sympy TypeError:无法确定关系
我正在运行 this git repo code,它应该开箱即用,没有错误(新仓库)。所以,我不确定为什么我会收到这个错误。我没有更改原始代码,并且使用与 DJ-RN repo 维护者完全相同的数据集:
最初,错误发生在此处(即使在将 and 更改为 & 和或更改为 | 之后)。
if radius is not None:
value = {t1: _t1,t2: _t2,t3: _t3,x_mid: _x_mid,theta: _theta,focal_length: _focal_length,vec_20: vec_2[0],vec_21: vec_2[1],vec_22: vec_2[2],r: radius}
for i in range(4):
ansx = root1[i][0].evalf(subs=value)
ansy = root1[i][1].evalf(subs=value)
ansz = root1[i][2].evalf(subs=value)
print('ansx is: ',ansx)
print('ansy is: ',ansy)
print('ansz is: ',ansz)
print('_t1 is: ',_t1)
print('_t2 is: ',_t2)
print('_t3 is: ',_t3)
print('_focal_length is: ',_focal_length)
y2D = (-ansy + _t2) / (ansz + _t3) * _focal_length
x2D = (-ansx + _t1) / (ansz + _t3) * _focal_length
print('y2D is: ',y2D)
print('x2D is: ',x2D)
if (((y2D >= oBox[1]) & (y2D <= oBox[3])) | ((y2D <= oBox[1]) & (y2D >= oBox[3]))):
idx = i
ansx = root1[idx][0].evalf(subs=value)
ansy = root1[idx][1].evalf(subs=value)
ansz = root1[idx][2].evalf(subs=value)
print('ansz free symbols: ',ansz.free_symbols)
print('line 259: ansz is: ',ansz)
print('maxz is: ',maxz)
print('minz is: ',minz)
if ((ansz > maxz) or (ansz < minz)):
PrevIoUsly this is the line that threw an error (same as title):
if (((y2D >= oBox[1]) and (y2D <= oBox[3])) or ((y2D <= oBox[1]) and (y2D >= oBox[3]))):
然后按照 this Stackoverflow answer 的 @sylee957 ,我将其更改为以下但没有解决方案:
if (((y2D >= oBox[1]) & (y2D <= oBox[3])) | ((y2D <= oBox[1]) & (y2D >= oBox[3]))):
我得到:
....
y2D is: 5000*(0.321072 - (focal_length*t2*sin(theta/2)*Abs(focal_length**2*vec_21**2 + focal_length**2*vec_22**2 + 2*focal_length*vec_20*vec_22*x_mid + vec_20**2*x_mid**2 + vec_21**2*x_mid**2) + ((-2.0*t3*(focal_length**2 + x_mid**2)*(focal_length**2*vec_22*(vec_20**2 + vec_21**2 + vec_22**2)**0.5*cos(theta/2)*Abs(r) + 1.4142135623731*focal_length*r*vec_21*(0.5*focal_length**2*vec_20**2*sin(theta/2)**2 - 0.5*focal_length**2*vec_20**2 + 0.5*focal_length**2*vec_21**2*sin(theta/2)**2 + 0.5*focal_length**2*vec_22**2*sin(theta/2)**2 + focal_length*vec_20*vec_22*x_mid + 0.5*vec_20**2*x_mid**2*sin(theta/2)**2 + 0.5*vec_21**2*x_mid**2*sin(theta/2)**2 + 0.5*vec_22**2*x_mid**2*sin(theta/2)**2 - 0.5*vec_22**2*x_mid**2)**0.5 + focal_length*vec_20*x_mid*(vec_20**2 + vec_21**2 + vec_22**2)**0.5*cos(theta/2)*Abs(r) - t3*(focal_length**2*vec_21**2 + focal_length**2*vec_22**2 + 2.0*focal_length*vec_20*vec_22*x_mid + vec_20**2*x_mid**2 + vec_21**2*x_mid**2)*Abs(sin(theta/2)))*(focal_length**2*vec_21**2 + focal_length**2*vec_22**2 + 2.0*focal_length*vec_20*vec_22*x_mid + vec_20**2*x_mid**2 + vec_21**2*x_mid**2)*sin(theta/2)**2 - 2.0*(focal_length**2 + x_mid**2)*(0.707106781186547*focal_length**2*vec_22*(vec_20**2 + vec_21**2 + vec_22**2)**0.5*cos(theta/2)*Abs(r) + focal_length*r*vec_21*(0.5*focal_length**2*vec_20**2*sin(theta/2)**2 - 0.5*focal_length**2*vec_20**2 + 0.5*focal_length**2*vec_21**2*sin(theta/2)**2 + 0.5*focal_length**2*vec_22**2*sin(theta/2)**2 + focal_length*vec_20*vec_22*x_mid + 0.5*vec_20**2*x_mid**2*sin(theta/2)**2 + 0.5*vec_21**2*x_mid**2*sin(theta/2)**2 + 0.5*vec_22**2*x_mid**2*sin(theta/2)**2 - 0.5*vec_22**2*x_mid**2)**0.5 + 0.707106781186547*focal_length*vec_20*x_mid*(vec_20**2 + vec_21**2 + vec_22**2)**0.5*cos(theta/2)*Abs(r) - 0.707106781186547*t3*(focal_length**2*vec_21**2 + focal_length**2*vec_22**2 + 2.0*focal_length*vec_20*vec_22*x_mid + vec_20**2*x_mid**2 + vec_21**2*x_mid**2)*Abs(sin(theta/2)))**2*Abs(sin(theta/2)) + 4.0*(focal_length**2*r**2 - focal_length**2*t3**2*sin(theta/2)**2 - t3**2*x_mid**2*sin(theta/2)**2)*(0.5*focal_length**2*vec_21**2 + 0.5*focal_length**2*vec_22**2 + focal_length*vec_20*vec_22*x_mid + 0.5*vec_20**2*x_mid**2 + 0.5*vec_21**2*x_mid**2)**2*Abs(sin(theta/2)))/Abs(sin(theta/2)))**0.5)/(focal_length*sin(theta/2)*Abs(focal_length**2*vec_21**2 + focal_length**2*vec_22**2 + 2*focal_length*vec_20*vec_22*x_mid + vec_20**2*x_mid**2 + vec_21**2*x_mid**2)))/((focal_length**2*vec_22*(vec_20**2 + vec_21**2 + vec_22**2)**0.5*cos(theta/2)*Abs(r) + 1.4142135623731*focal_length*r*vec_21*(0.5*focal_length**2*vec_20**2*sin(theta/2)**2 - 0.5*focal_length**2*vec_20**2 + 0.5*focal_length**2*vec_21**2*sin(theta/2)**2 + 0.5*focal_length**2*vec_22**2*sin(theta/2)**2 + focal_length*vec_20*vec_22*x_mid + 0.5*vec_20**2*x_mid**2*sin(theta/2)**2 + 0.5*vec_21**2*x_mid**2*sin(theta/2)**2 + 0.5*vec_22**2*x_mid**2*sin(theta/2)**2 - 0.5*vec_22**2*x_mid**2)**0.5 + focal_length*vec_20*x_mid*(vec_20**2 + vec_21**2 + vec_22**2)**0.5*cos(theta/2)*Abs(r) - t3*(focal_length**2*vec_21**2 + focal_length**2*vec_22**2 + 2.0*focal_length*vec_20*vec_22*x_mid + vec_20**2*x_mid**2 + vec_21**2*x_mid**2)*Abs(sin(theta/2)))/((focal_length**2*vec_21**2 + focal_length**2*vec_22**2 + 2.0*focal_length*vec_20*vec_22*x_mid + vec_20**2*x_mid**2 + vec_21**2*x_mid**2)*Abs(sin(theta/2))) + 23.578)
x2D is: 5000*(0.477802 - (-focal_length**2*t1*vec_21**2 - focal_length**2*t1*vec_22**2 - 2.0*focal_length*t1*vec_20*vec_22*x_mid + focal_length*vec_22*x_mid*(vec_20**2 + vec_21**2 + vec_22**2)**0.5*cos(theta/2)*Abs(r)/Abs(sin(theta/2)) + 1.4142135623731*r*vec_21*x_mid*(0.5*focal_length**2*vec_20**2*sin(theta/2)**2 - 0.5*focal_length**2*vec_20**2 + 0.5*focal_length**2*vec_21**2*sin(theta/2)**2 + 0.5*focal_length**2*vec_22**2*sin(theta/2)**2 + focal_length*vec_20*vec_22*x_mid + 0.5*vec_20**2*x_mid**2*sin(theta/2)**2 + 0.5*vec_21**2*x_mid**2*sin(theta/2)**2 + 0.5*vec_22**2*x_mid**2*sin(theta/2)**2 - 0.5*vec_22**2*x_mid**2)**0.5/Abs(sin(theta/2)) - t1*vec_20**2*x_mid**2 - t1*vec_21**2*x_mid**2 + vec_20*x_mid**2*(vec_20**2 + vec_21**2 + vec_22**2)**0.5*cos(theta/2)*Abs(r)/Abs(sin(theta/2)))/(focal_length**2*vec_21**2 + focal_length**2*vec_22**2 + 2.0*focal_length*vec_20*vec_22*x_mid + vec_20**2*x_mid**2 + vec_21**2*x_mid**2))/((focal_length**2*vec_22*(vec_20**2 + vec_21**2 + vec_22**2)**0.5*cos(theta/2)*Abs(r) + 1.4142135623731*focal_length*r*vec_21*(0.5*focal_length**2*vec_20**2*sin(theta/2)**2 - 0.5*focal_length**2*vec_20**2 + 0.5*focal_length**2*vec_21**2*sin(theta/2)**2 + 0.5*focal_length**2*vec_22**2*sin(theta/2)**2 + focal_length*vec_20*vec_22*x_mid + 0.5*vec_20**2*x_mid**2*sin(theta/2)**2 + 0.5*vec_21**2*x_mid**2*sin(theta/2)**2 + 0.5*vec_22**2*x_mid**2*sin(theta/2)**2 - 0.5*vec_22**2*x_mid**2)**0.5 + focal_length*vec_20*x_mid*(vec_20**2 + vec_21**2 + vec_22**2)**0.5*cos(theta/2)*Abs(r) - t3*(focal_length**2*vec_21**2 + focal_length**2*vec_22**2 + 2.0*focal_length*vec_20*vec_22*x_mid + vec_20**2*x_mid**2 + vec_21**2*x_mid**2)*Abs(sin(theta/2)))/((focal_length**2*vec_21**2 + focal_length**2*vec_22**2 + 2.0*focal_length*vec_20*vec_22*x_mid + vec_20**2*x_mid**2 + vec_21**2*x_mid**2)*Abs(sin(theta/2))) + 23.578)
line 259: ansz is: (focal_length**2*vec_22*(vec_20**2 + vec_21**2 + vec_22**2)**0.5*cos(theta/2)*Abs(r) + 1.4142135623731*focal_length*r*vec_21*(0.5*focal_length**2*vec_20**2*sin(theta/2)**2 - 0.5*focal_length**2*vec_20**2 + 0.5*focal_length**2*vec_21**2*sin(theta/2)**2 + 0.5*focal_length**2*vec_22**2*sin(theta/2)**2 + focal_length*vec_20*vec_22*x_mid + 0.5*vec_20**2*x_mid**2*sin(theta/2)**2 + 0.5*vec_21**2*x_mid**2*sin(theta/2)**2 + 0.5*vec_22**2*x_mid**2*sin(theta/2)**2 - 0.5*vec_22**2*x_mid**2)**0.5 + focal_length*vec_20*x_mid*(vec_20**2 + vec_21**2 + vec_22**2)**0.5*cos(theta/2)*Abs(r) - t3*(focal_length**2*vec_21**2 + focal_length**2*vec_22**2 + 2.0*focal_length*vec_20*vec_22*x_mid + vec_20**2*x_mid**2 + vec_21**2*x_mid**2)*Abs(sin(theta/2)))/((focal_length**2*vec_21**2 + focal_length**2*vec_22**2 + 2.0*focal_length*vec_20*vec_22*x_mid + vec_20**2*x_mid**2 + vec_21**2*x_mid**2)*Abs(sin(theta/2)))
maxz is: 0.47865486
minz is: -0.43096042
Traceback (most recent call last):
File "test.py",line 32,in <module>
otri,_ = get_param(result,hBox,oBox,htri,img,radius,gamma_min,gamma_max)
File "/home/mona/research/code/DJ-RN/script/generate_utils.py",line 261,in get_param
if (ansz > maxz or ansz < minz):
File "/home/mona/anaconda3/lib/python3.8/site-packages/sympy/core/relational.py",line 384,in __nonzero__
raise TypeError("cannot determine truth value of Relational")
TypeError: cannot determine truth value of Relational
如您所见,x2D
和 y2D
(分别为 ansz
)有很多自由参数。我不知道为什么他们没有得到值以及在调试这个问题后如何去做。
这是抛出错误的脚本:test.py https://pastebin.com/raw/tnqK44az
这里是错误产生的代码:https://pastebin.com/raw/fyjpEdES
这是我针对我面临的这个问题创建的 git 讨论:https://github.com/sympy/sympy/discussions/20690
这是运行 $ python test.py
的完整日志:https://pastebin.com/raw/g4xSbPAe
解决方法
据说
(((y2D >= obox[1]) and (y2D <= obox[3])) or ((y2D <= obox[1]) and (y2D >= obox[3])))
或
(((y2D >= obox[1]) & (y2D <= obox[3])) | ((y2D <= obox[1]) & (y2D >= obox[3])))
不能用作 if
语句的条件。 if
需要一个简单的 True 或 False。 numpy
使用经常有这样的问题,因为数组的条件产生一个布尔数组,例如np.array([True,False,True])
,他们得到一个 Ambiguity error
。这似乎是 sympy
等价物。
第一个中的 and/or
也有这个问题,因为它们隐含地将 if
测试作为评估的一部分。
我建议您准确了解这些条件正在做什么(或应该做什么)。您可能需要检查 (y2D >= obox[1])
等部分
您可能还需要向原始 repo
github 提出问题。并仔细检查您的设置是否与原始设置匹配。使用您自己的数据或变量尝试开箱即用的代码可能会很棘手,尤其是当您对底层语言(例如 Python 和 sympy)没有太多经验时。与来源意图的任何微小偏差都可能导致难以理解的错误。
在 isympy
会话中I have a symbol
x`:
In [31]: x
Out[31]: x
In [32]: x>0 # this is a relational
Out[32]: x > 0
In [33]: if x>0: print('yes')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-33-cea59247e99a> in <module>
----> 1 if x>0: print('yes')
/usr/local/lib/python3.8/dist-packages/sympy/core/relational.py in __bool__(self)
393
394 def __bool__(self):
--> 395 raise TypeError("cannot determine truth value of Relational")
396
397 def _eval_as_set(self):
TypeError: cannot determine truth value of Relational
如果我执行 subs
用数值替换变量,则 if 有效:
In [35]: x.subs({x:1})
Out[35]: 1
In [36]: if x.subs({x:1})>0: print('yes')
yes
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。