首页 > 解决方案 > numpy 跨矩阵执行条件运算

问题描述

我有这段代码适用于我试图在整个矩阵上执行的单个值。我从矩阵开始sst并使用它来获取矩阵pb_opt

    if sst < -10:
        pb_opt = 0
    elif sst < -1:
        pb_opt = 1.13
    elif sst > 28.5:
        pb_opt = 4
    else:
        pb_opt = 1.2956 + (2.749e-1 * sst) + 6.17e-2 * (sst ** 2) - 2.05e-2 * (sst ** 3)
        +2.462e-3 * (sst ** 4) - 1.348e-4 * (sst ** 5) + 3.4132e-6 * (sst ** 6)
        -3.27e-8 * (sst ** 7)

我通过运行开始工作的前几个 if/else 语句:

    pb_opt = np.full(sst.shape, np.nan)
    pb_opt[sst < -10] = 0
    pb_opt[(-10 <= sst) & (sst < -1)] = 1.13
    pb_opt[sst > 28.5] = 4

但是,我正在努力完成最后一个声明。我已经尝试了几件事,我认为我得到的最接近的是:

    pb_opt[(-1 >= sst) & (sst <= 28)] = (
        1.2956
        + (0.2749 * sst[(-1 >= sst) & (sst <= 28)])
        + 0.0617 * (sst[(-1 >= sst) & (sst <= 28)] ** 2)
        - 0.0205 * (sst[(-1 >= sst) & (sst <= 28)] ** 3)
        + 2.462e-3 * (sst[(-1 >= sst) & (sst <= 28)] ** 4)
        - 1.348e-4 * (sst[(-1 >= sst) & (sst <= 28)] ** 5)
        + 3.4132e-6 * (sst[(-1 >= sst) & (sst <= 28)] ** 6)
        - 3.27e-8 * (sst[(-1 >= sst) & (sst <= 28)] ** 7)
    )

除了有点难看之外,这给了我错误IndexError: 2-dimensional boolean indexing is not supported.。有谁知道我怎么能做到这一点?

标签: pythonnumpynumpy-ndarray

解决方案


sst就这样做,如果大小非常大,它会有点慢。如果不是,那么这是一个优雅的解决方案

pb_opt  = 1.2956                    \
        + 2.749e-1  * (sst ** 1)    \
        + 6.17e-2   * (sst ** 2)    \
        - 2.05e-2   * (sst ** 3)    \
        + 2.462e-3  * (sst ** 4)    \
        - 1.348e-4  * (sst ** 5)    \
        + 3.4132e-6 * (sst ** 6)    \
        - 3.27e-8   * (sst ** 7)


pb_opt[sst < -1  ] = 1.13
pb_opt[sst < -10 ] = 0
pb_opt[sst > 28.5] = 4

推荐阅读