这个问题与this one https://stackoverflow.com/q/73672739/11004423.
我有一个正在尝试矢量化的函数。这是原来的函数:
def aspect_good(angle: float, planet1_good: bool, planet2_good: bool):
"""
Decides if the angle represents a good aspect.
NOTE: returns None if the angle doesn't represent an aspect.
"""
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
这就是我到目前为止所拥有的:
def aspects_good(
angles: npt.ArrayLike,
planets1_good: npt.ArrayLike,
planets2_good: npt.ArrayLike,
) -> npt.NDArray:
"""
Decides if the angles represent good aspects.
Note: this function was contributed by Mad Physicist. Thank you.
https://stackoverflow.com/q/73672739/11004423
:returns: an array with values as follows:
1 – the angle is a good aspect
0 – the angle is a bad aspect
-1 – the angle doesn't represent an aspect
"""
result = np.full_like(angles, -1, dtype=np.int8)
bad_mask = np.abs(angles % 90) <= 6
result[bad_mask] = 0
good_mask = (np.abs(angles - 120) <= 8) |\
(np.abs(angles - 60) <= 8) |\
((np.abs(angles - 4) <= 4) & planets1_good & planets2_good)
result[good_mask] = 1
return result
它没有按预期工作,但是,我用 pytest 编写了一个测试:
def test_aspects_good():
tests = np.array([
[120, True, False, True],
[60, True, False, True],
[180, True, False, False],
[90, True, False, False],
[129, True, False, -1],
[111, True, False, -1],
[69, True, False, -1],
[51, True, False, -1],
[187, True, False, -1],
[173, True, False, -1],
[97, True, False, -1],
[83, True, False, -1],
[0, True, True, True],
[0, True, False, False],
[0, False, True, False],
[0, False, False, False],
[7, False, False, -1],
[7, True, True, True],
[9, True, True, -1],
])
angles = tests[:, 0]
planets1_good = tests[:, 1]
planets2_good = tests[:, 2]
expected = tests[:, 3]
result = aspects_good(angles, planets1_good, planets2_good)
assert np.array_equal(result, expected)
它失败了,说 False,数组不同。
这里我有result
and expected
数组并排组合:
array([[ 1, 1],
│ [ 1, 1],
│ [ 0, 0],
│ [ 0, 0],
│ [-1, -1],
│ [-1, -1],
│ [-1, -1],
│ [-1, -1],
│ [-1, -1],
│ [-1, -1],
│ [-1, -1],
│ [-1, -1],
│ [ 0, 1],
│ [ 0, 0],
│ [ 0, 0],
│ [ 0, 0],
│ [-1, -1],
│ [-1, 1],
│ [-1, -1]])
注意:第一列是result
数组,第二个是expected
。正如您所看到的,它们有两个地方不同。现在问题来了“如何调试这个?”通常我会使用调试器,并逐步执行每个 if/elif/else 条件。但我不知道如何调试 numpy 掩码。