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

时间:2013-08-27 12:10:28

标签: 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 over logging method

这可能是最好的方法,但感觉某种方式'LBYL'是pythonic - 我通常处理超过1e6元素的数组 - 然后循环 - 所以我有点担心性能影响执行两次检查(一次创建'检查'数组时 - 然后在对所有元素求和时再次查看其中一个是否为'真')。

有没有人知道更好(更有效)的方式呢?

1 个答案:

答案 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
    ...