python - python - 如何构建具有相同值对的元组数组的策略?

我想为NumPy测试生成:


array([[-2, -2],


 [-3, -3],


 [5, 5],


 [-1, -1]], dtype=int16)



我尝试的是:


import numpy as np


from hypothesis.strategies import integers


from hypothesis.extra.numpy import arrays


arrays(np.int16, (4,2), elements=integers(-10, 10)).example()



不幸的是,我不能让元组中的值相同,所以上面的查询返回:


array([[ 5, 5],


 [-7, 5],


 [ 5, 5],


 [ 5, 5]], dtype=int16)



时间: 作者:

在不考虑np的情况下,你可以使用生成器生成元组:


tuple_list = [tuple(a) for a in arrays(np.int16, (4,2), elements=integers(-10,10)).example()]



作者:

你可以像这样构造所需的数组:


import numpy as np


from hypothesis.strategies import integers


strat = integers(10, -10)


np.array([[x, x] for x in [strat.example() for _ in range(4)]], np.int16)



示例结果:


array([[-9, -9],


 [ 0, 0],


 [-2, -2],


 [ 0, 0]], dtype=int16)



如果不喜欢2维,你可以同时拥有这两个参数,如下所示:


def get_array(rows, cols, strat):


 np.array([[x]*cols for x in [strat.example() for _ in range(rows)]], np.int16)



get_array(4, 2, integers(-10, 10))



作者:

让numpy.array接受列表的列表来创建数组,

  • 首先,生成一个整数并创建一个重复多次的值列表来满足宽度,
  • 第二,生成在第一步中创建的列表的深度长度列表,
  • 第三,可以将第二步的结果提供给numpy.array,确保dtype与在第一步中生成值的策略匹配,
  • 
    # %%
    
    
    """How to build a strategy to create array of tuples with pairs of identical values."""
    
    
    from hypothesis import given, settings, strategies as st
    
    
    
    import numpy as np
    
    
    
    WIDTH = 2
    
    
    DEPTH = 4
    
    
    MIN_VALUE = -10
    
    
    MAX_VALUE = 10
    
    
    
    # Build the row
    
    
    width_strategy = st.integers(MIN_VALUE, MAX_VALUE).map(lambda i: [i for x in range(WIDTH)])
    
    
    # Build the array of rows
    
    
    depth_strategy = st.lists(width_strategy, min_size=DEPTH, max_size=DEPTH, unique_by=lambda l: str(l))
    
    
    
    @settings(max_examples=10)
    
    
    @given(list_of_lists=depth_strategy)
    
    
    def create_numpy_array(list_of_lists):
    
    
    """Turn list of lists into numpy array."""
    
    
     a = np.array(list_of_lists, dtype=np.int64)
    
    
     print(f"A numpy array could be:n{a}")
    
    
    
    create_numpy_array()
    
    
    
    

你可以使用flatmap来组合宽度和深度策略,但是我还没有想到怎么做,或者,你可以使用@composite decorator从hypothesis.strategies创建函数。

作者:
...