代码之家  ›  专栏  ›  技术社区  ›  maschu

大整数数组逻辑中遇到无效值

  •  0
  • maschu  · 技术社区  · 7 年前

    “为什么我得到一个无效值…”已经讨论过几次了。这是另一个我还不太理解的变体——这就是我打开这条线索的原因:

    (1) 在

    y = np.nan
    (~np.isnan(y)) & (y > 5.)
    

    我得到了正确的结果,没有抛出错误。

    (2) 然而,在

    y = np.array([np.isnan, 6.])
    (~np.isnan(y)) & (y > 5.)
    

    显示“较大值中遇到无效值”警告。

    这意味着短路( Python reference )如果此表达式与numpy数组一起使用,则布尔and表达式不起作用。

    在堆栈溢出上挖掘一点(例如。 ref )在其他地方,数组表达式似乎写为

    np.logical_and.reduce([~np.isnan(y), y>5.])
    

    这意味着在组合这两个表达式之前,首先对所有元素求值(实际上,这会产生相同的警告)。有人能确认这是怎么回事吗?除了在所有数组元素上循环外,还有人能解决这个问题吗?

    我在其中使用此表达式的上下文是,如果数组中的其他值超过阈值,则将其设置为nan,即实际代码具有以下内容:

    y[(~np.isnan(y)) & (y > 5.)] = np.nan
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Daniel F    7 年前

    这可以做到,通过一些布尔索引来避免 nan 和a where

    y[np.isfinite(y)] = np.where(y[np.isfinite(y)] > 5, np.nan, y[np.isfinite(y)])
    
        2
  •  0
  •   maschu    7 年前

    好的:看来我自己找到了一个解决方案:

    array_and = np.frompyfunc(lambda x: (~np.isnan(x)) & (x > 5.), 1, 1)
    array_and(y)
    

    似乎有效。参考:[ 1 ]