from functools import partial
import hypothesis as h
import hypothesis.strategies as hs
import hypothesis.extra.numpy as hnp
import numpy as np
floats_notnull = partial(hs.floats, allow_nan=False, allow_infinity=False)
complex_notnull = partial(hs.complex_numbers, allow_nan=False, allow_infinity=False)
data_strategy_real = hnp.arrays(
np.float64,
hs.tuples(hs.integers(min_value=2, max_value=50),
hs.integers(min_value=2, max_value=5)),
floats_notnull()
)
data_strategy_complex = hnp.arrays(
np.complex64,
hs.tuples(hs.integers(min_value=2, max_value=50), hs.just(1)),
complex_notnull()
)
data_strategy = hs.one_of(data_strategy_real, data_strategy_complex)
如果您运行了几次data_strategy.example()
,您会注意到结果中的一些值有无限的实部或虚部。我在这里的目的是明确地不允许无限或NaN部分。
我做错了什么?
更新:如果我使用
data_strategy = hs.lists(complex_notnull, min_size=2, max_size=50)
并将其转换为测试中的数组,问题似乎就消失了。复杂的数字是否满溢了?我不会从假设中得到关于溢出的通常的反对警告。
如果我用
data_strategy = data_strategy_real
没有出现inf
s。
发布于 2018-09-20 16:56:19
complex64类型太小,而且溢出了。不知何故,假设没能理解这一点。
是的,这个问题的根本原因是你正在生成64位有限浮点数,然后将它们转换成32位(因为complex64
是一对32位浮点数)。您可以将width=32
参数修正为floats()
。
floats_notnull_32 = partial(hs.floats, allow_nan=False, allow_infinity=False, width=32)
而且您没有得到通常的溢出检查,因为目前它只为浮点数和整数实现。。我也打开(编辑:和修正) 第1591期来检查复杂和字符串类型。
发布于 2018-09-19 09:30:21
complex64
类型太小,而且溢出了。不知何故,假设没能理解这一点。
现在切换到complex128
解决了这个问题。
https://stackoverflow.com/questions/52410975
复制