Предопределенная функция Python - PullRequest
0 голосов
/ 07 ноября 2018

В моем коде я использую следующую структуру, чтобы избежать условий в цикле for:

if patch_type == "zeros":
    patch_fct = np.zeros
elif patch_type == "ones":
    patch_fct = np.ones
elif patch_type == "rand":
    patch_fct = np.random.random_sample
else:
    raise "Error"

for k in range(10**9):
    m, n = comp_size()
    bla = patch_fct((m,n))

, где patch_fct может быть легко использован с туфлями.

Теперь я хочу использовать тот же подход, чтобы создать patch_fct, который принимает tupel и возвращает равномерно распределенные случайные числа от -1 до 1. Как я могу это сделать?

Я хотел бы сделать что-то вроде:

patch_fct = 2. * (np.random.random_sample - 0.5)

Подход сверху не кажется правильным.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Если вам нужна функция, которой еще нет, вы можете просто определить ее и использовать ее имя с этого момента.

Например:

if foo:
    def patch_fct(tup):
        return 2*(np.random.random_sample(tup) - 0.5)
elif bar:
    def patch_fct(tup):
        # do something else
else:
    patch_fct = another_existing_function

С помощью словаря цепочку ifs и elses можно написать более плавно.

Для исходного кода вы можете написать

patch_functions = {'zeros': np.zeros, 
                   'ones': np.ones, 
                   'rand': np.random.random_sample}

и затем используйте его так:

>>> patch_functions['zeros'](5)
>>> array([0., 0., 0., 0., 0.])

Это автоматически выдаст KeyError, если вы пытаетесь получить доступ к ключу, который не существует в словаре.

Вы также можете помещать самоопределенные функции в словарь, определяя их перед вставкой или используя анонимные функции lambda. Демонстрация:

>>> def fun1(tup):
...:    return sum(tup) + 1
>>> 
>>> my_functions = {'my_sum': fun1, 'my_random': lambda tup: 2*(np.random.random_sample(tup) - 0.5)}
>>> my_functions['my_sum']((2, 5))
>>> 8
>>> my_functions['my_random']((2, 5))
>>> 
array([[-0.20203832, -0.23868021,  0.72052191,  0.72931098, -0.57160796],
       [-0.45117601, -0.95461634, -0.52232593, -0.24011216, -0.83875935]])
0 голосов
/ 07 ноября 2018

numpy предоставляет такую ​​функцию явно :

numpy.random.uniform(low=-1, high=1, size=None)

size - количество раз для рисования - это может быть кортеж с указанием размеров результирующего массива. size=(10,10) даст матрицу 10x10.

Если я вас правильно понимаю, то:

def patch_fct(size):
    return numpy.random.uniform(low=-1, high=1, size=size)

и size могут быть кортежами (или нет).

В общем, поиск numpy с некоторой математикой / вероятностью даст правильный ответ при первом попадании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...