我有一个数组,想要更改一些元素,如果它们是负数(可能是任何布尔条件),但我也想知道我的代码是否这样做。
目前我有
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
这可能是最好的方法,但感觉某种方式'LBYL'是pythonic - 我通常处理超过1e6元素的数组 - 然后循环 - 所以我有点担心性能影响执行两次检查(一次创建'检查'数组时 - 然后在对所有元素求和时再次查看其中一个是否为'真')。
有没有人知道更好(更有效)的方式呢?
答案 0 :(得分:3)
如果您只想保留元素>=0
,则应使用np.clip:
np.clip(Mat, 0, np.inf, out=Mat)
更有效地实现这一目标的另一种方法是:
Mat[ Mat<0 ] = 0
在这两种情况下,您都放弃if
语句,如果必须保留,则可以使用np.any
,如果True
中有任何元素,则会返回Check
具有True
值,避免求和。
Check = Mat<0
if np.any(Check):
Mat[Check] = 0
...