Принятый ответ неверен и не работает. Проблема в том, что Случайные распределения NumPy принимают разные необходимые аргументы, поэтому немного неудобно передавать size
всемих, потому что это карг. (Вот почему пример в принятом решении возвращает неправильное количество выборок - только 1, а не 5, которые были запрошены. Это потому, что первый аргумент для chisquare
это df
, а не size
.)
Распространено желание вызывать функции по имени. Кроме того, что он не работает, в принятом ответе используется eval()
, что является общим предложенным решением проблемы. Но обычно считается плохой идеей, по разным причинам .
Лучший способ добиться того, чего вы хотите, - это определить словарь, который отображает строки, представляющие имена функций, в функциисамих себя. Например:
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
DISTRIBUTIONS = {
'standard_cauchy': np.random.standard_cauchy,
'standard_exponential': np.random.standard_exponential,
'standard_normal': np.random.standard_normal,
'chisquare': lambda size: np.random.chisquare(df=1, size=size),
}
def get_rand_dstr(dstr_name):
npdstr = DISTRIBUTIONS[dstr_name]
size = int(input("How many datapoints?"))
dstr = npdstr(size=size)
return plt.hist(dstr)
get_rand_dstr('chisquare')
Это прекрасно работает - для функций, для которых я сделал клавиши. Вы могли бы сделать больше - 35, я думаю, - но проблема в том, что у них не все одинаковые API. Другими словами, вы не можете вызывать их всех только с size
в качестве аргумента. Например, для np.random.chisquare()
требуется параметр df
или «степени свободы». Другие функции требуют других вещей. Вы могли бы делать предположения об этих вещах и переносить все вызовы функций (как я делал выше, для chisquare
) ... если это то, что вы хотите сделать?