Я обнаружил, что если мне нужно управлять содержимым внутри существующей структуры стратегии (например, пары одинаковых значений внутри массива), мне нужно пропустить эту стратегию для более низкоуровневых с помощью которое я могу создать «готовое» значение, которое может засеять тип, который я хочу сгенерировать.
Давайте воспользуемся тем, что numpy.array принимает список списков для создания массива. Предположим также, что вы хотите, чтобы каждая строка была уникальной, поскольку в вашем примере не отображаются повторяющиеся строки. Если это нежелательно, удалите unique_by=str
из определения depth_strategy
.
- Сгенерируйте целое число и создайте список этого значения, повторяющийся несколько раз, чтобы соответствовать ШИРИНЕ.
- Сгенерируйте список длины ГЛУБИНЫ из тех списков, которые мы создали на первом шаге.
- Объедините две стратегии, вложив их.
- Загрузите результат третьего шага в numpy.array, убедившись, что dtype соответствует стратегии, используемой для генерации значений на первом шаге.
# %%
"""Hypothesis strategy for 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 - Here for clarification only
width_strategy = st.integers(MIN_VALUE, MAX_VALUE).map(
lambda i: tuple(i for _ in range(WIDTH))
)
# Build the array of rows - Here for clarification only
depth_strategy = st.lists(
width_strategy, min_size=DEPTH, max_size=DEPTH, unique_by=str
).map(lambda lot: np.array(lot, dtype=np.int64))
# All-in-One
complete_strategy = st.lists(
st.integers(MIN_VALUE, MAX_VALUE).map(
lambda i: tuple(i for _ in range(WIDTH))
),
min_size=DEPTH,
max_size=DEPTH,
unique_by=str,
).map(lambda lot: np.array(lot, dtype=np.int64))
@settings(max_examples=10)
@given(an_array=complete_strategy)
def create_numpy_array(an_array):
"""Turn list of lists into numpy array."""
print(f"A numpy array could be:\n{an_array}")
create_numpy_array()
Это генерирует что-то вроде:
A numpy array could be:
[[ 3 3]
[ 9 9]
[-5 -5]
[ 0 0]]
A numpy array could be:
[[ 3 3]
[-2 -2]
[ 4 4]
[-5 -5]]
A numpy array could be:
[[ 7 7]
[ 0 0]
[-2 -2]
[-1 -1]]
Обратите внимание, что я установил max_examples равным 10, поскольку Гипотеза дает более высокое отношение вхождений к значениям, которые она считает «проблемными», например, ноль, NaN, Infinity и т. Д. Таким образом, example () или меньшее количество примеров, вероятно, сгенерируют множество массивов 2x4 всех нулей. К счастью, здесь нам помогает ограничение unique_by.
person
Arnoud
schedule
20.01.2020