为了账号安全,请及时绑定邮箱和手机立即绑定

蟒蛇谓词和条件语句

蟒蛇谓词和条件语句

吃鸡游戏 2022-09-13 17:28:35
github上的一位用户报告了使用numba无蟒蛇模式的以下代码的错误:from numba import njitimport numpy as np@njitdef foo():    a = np.ones(1, np.bool_)    if a > 0:        print('truebr')    else:        print('falsebr')foo()他被告知,该表达式不是谓词,而是条件句。为了解决这个问题,他要“将条件包装在真理中以创建谓词”。a > 0这是否意味着这将修复numba或其他东西中出现的错误。(a > 0) == Truehttps://github.com/numba/numba/pull/3901/commits/598cdd1707fdeb11b8f1d70aef2d3e36ef37bd34。这是 numba 中这些类型的错误的修复程序吗?
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

在Python(不是)中,该函数的工作原理是:numba


In [412]: def foo(): 

     ...:     a = np.ones(1, np.bool_) 

     ...:     if a > 0: 

     ...:         print('truebr') 

     ...:     else: 

     ...:         print('falsebr') 

     ...:                                                                                      

In [413]: foo()                                                                                

truebr

但如果 是具有更多值的数组:a


In [414]: def foo(): 

     ...:     a = np.ones(2, np.bool_) 

     ...:     if a > 0: 

     ...:         print('truebr') 

     ...:     else: 

     ...:         print('falsebr') 

     ...:                                                                                      

In [415]: foo()                                                                                

...

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

如果我尝试你的函数,我会得到一个很长的回溯;太长而无法显示或分析,但它基本上告诉我它无法在模式下完成。鉴于上述值错误,我并不感到惊讶。 不允许“仅一个”真值数组。njitnjitnjit


作为一般规则,使用时应进行迭代。这是它的主要目的 - 运行那些本来太昂贵而无法迭代的问题。不要指望处理Python的所有细微差别。numbanumpy/pythonnumba


如果我更改函数来测试 的每个元素,它的工作原理:a


In [421]: @numba.njit 

     ...: def foo(): 

     ...:     a = np.array([True]) 

     ...:     for i in a: 

     ...:         if i > 0: 

     ...:             print('truebr') 

     ...:         else: 

     ...:             print('falsebr') 

     ...:                                                                                      

In [422]: foo()                                                                                

truebr

一个(或)包装器也可以工作:allany


In [423]: @numba.njit 

     ...: def foo(): 

     ...:     a = np.array([True]) 

     ...:     if (a > 0).all(): 

     ...:         print('truebr') 

     ...:     else: 

     ...:         print('falsebr') 

     ...:                                                                                      

In [424]: foo()                                                                                

truebr


查看完整回答
反对 回复 2022-09-13
  • 1 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信