Как использовать аргумент функции в качестве метода npy, если это возможно - PullRequest
1 голос
/ 21 ноября 2019

Я пытаюсь создать функцию, которая будет принимать в качестве аргумента пустое имя dstr и строить гистограмму случайных точек данных из этого распределения.

, если он работает только в дистрибутивах npy, которые требуют 1 аргумента, что нормально. Просто очень застрял при попытке создать np.random.distribution () ... \

# import libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline 

#Define a function (Fnc) that produces random numpy distributions (dstr)
#Fnc args: [npy dstr name as lst of str], [num of data pts]
def get_rand_dstr(dstr_name):
  npdstr = dstr_name
  dstr = np.random.npdstr(user.input("How many datapoints?"))
  #here pass each dstr from dstr_name through for loop
  #for loop will prompt user for required args of dstr (nbr of desired datapoints)
  return plt.hist(df)

get_rand_dstr('chisquare')

1 Ответ

1 голос
/ 21 ноября 2019

Принятый ответ неверен и не работает. Проблема в том, что Случайные распределения 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) ... если это то, что вы хотите сделать?

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