You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将星体相位判断Python函数向量化适配Numpy数组?

向量化星体相位判断函数

我有如下函数:

def aspect_good(angle: float, planet1_good: bool, planet2_good: bool):
    """
    判断角度是否代表良好的星体相位。
    注意:若角度不对应任何相位则返回None。
    """

    if 112 <= angle <= 128 or 52 <= angle <= 68:
        return True
    elif 174 <= angle <= 186 or 84 <= angle <= 96:
        return False
    elif 0 <= angle <= 8 and planet1_good and planet2_good:
        return True
    elif 0 <= angle <= 6:
        return False
    else:
        return None

我希望将该函数向量化,使其可接收Numpy数组而非单个参数,函数签名如下:

def aspect_good(
    angles: np.ndarray[float],
    planet1_good: np.ndarray[bool],
    planet2_good: np.ndarray[bool],
) -> np.array[bool | None]:

但我不确定具体实现方式,已将各if、elif语句转换为掩码:

((112 <= angles) & (angles <= 128)) | ((52 <= angles) & (angles <= 68))
((174 <= angles) & (angles <= 186)) | ((84 <= angles) & (angles <= 96))
((0 <= angles) & (angles <= 8)) & planets1_good & planets2_good
((0 <= angles) & (angles <= 6))
# 如何转换else语句?

但我不清楚如何将这些掩码整合起来。能否有人提供帮助?我对Numpy经验不多,或许它有适用的函数可以完成此操作。


更新

非常感谢各位,尤其感谢@Mad Physicist。

我可以使用以下实现:

def aspect_good(angles: np.typing.ArrayLike, planets1_good: np.typing.ArrayLike, planets2_good: np.typing.ArrayLike) -> np.typing.NDArray:
    """
    判断角度是否代表良好的星体相位。
    """
    result = np.full_like(angle, -1, dtype=np.int8)

    false_mask = np.abs(angle % 90) <= 6
    result[false_mask] = 0

    true_mask = np.abs(angle % 60) <= 8
    result[true_mask] = 1

    return result

太棒了!向Mad Physicist致敬,这个解决方案简洁又优美,比我之前的实现更简单。祝您生活愉快,先生!


内容的提问来源于stack exchange,提问作者astroboy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 15:20:51