如何将星体相位判断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
相关产品推荐
相关产品推荐

