python数组对元素的条件更改检查numpy

python数组对元素的条件更改检查numpy,python,arrays,if-statement,numpy,Python,Arrays,If Statement,Numpy,我有一个数组,如果它们是负的(可以是任何布尔条件),我想更改一些元素,但是我也想知道我的代码是否做到了这一点 目前我有 Mat = #some source Check = Mat < 0 Check_flag = Check.sum() if check_flag != 0: Mat[Check] = 0 #reset those elements logger = logger + '\n This Mat needed to be fixed' #or some o

我有一个数组,如果它们是负的(可以是任何布尔条件),我想更改一些元素,但是我也想知道我的代码是否做到了这一点

目前我有

Mat = #some source
Check = Mat < 0
Check_flag = Check.sum()

if check_flag != 0:
    Mat[Check] = 0 #reset those elements
    logger = logger + '\n This Mat needed to be fixed' #or some over logging method
Mat=#一些源代码
检查=垫<0
Check_flag=Check.sum()
如果检查_标志!=0:
Mat[检查]=0#重置这些元素
logger=logger+“\n需要修复此垫”#或某些过度记录方法
这可能是最好的方法,但它感觉太“LBYL”了,不像pythonic——我通常处理超过1e6个元素的数组——然后循环——所以我有点担心执行两次检查的性能影响(一次是在创建“Check”数组时,另一次是在对所有元素求和以查看其中一个元素是否为“true”时)


有人知道更好(更有效)的方法吗?

如果您只想让元素
=0
,应该使用np.clip:

np.clip(Mat, 0, np.inf, out=Mat)
另一种更有效的方法是:

Mat[ Mat<0 ] = 0

np.clip
如果您想限制值,尤其是在适当的位置限制值,则速度要快得多。您可以使用
np.inf
作为上限。@Ophion谢谢,我刚刚编辑了答案…
np.inf
要优雅得多我认为
np.any()
看起来像我需要的,因为我还想做其他事情“如果且仅当”我必须删除否定项。@CastleH很棒…稍后您可以比较当前解决方案是否会有性能提升…如果您认为符合您的需要,请不要忘了接受答案;)作为补充说明,python中的变量名应该是小写的,和类名的第一个字母为大写。如果您大致遵循指示,其他人阅读您的代码要容易得多。在这个应用程序中,我通常使用大写字母表示矩阵(/numpy数组)——但我接受您的观点,即保持内容与商定的标准一致是一种良好的做法@J.Martinot-Lagarde
Check = Mat<0
if np.any(Check):
    Mat[Check] = 0
    ...