1

我正在尝试创建一个函数,它将一个 numpy dstr 名称作为参数并绘制来自该分布的随机数据点的直方图。

如果它仅适用于需要 1 个参数的 npy 发行版,那就可以了。只是真的坚持尝试创建 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')
4

2 回答 2

1

使用此代码,它可能会对您有所帮助下图显示了值和图

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

def get_rand_dstr(dstr_name):
#     npdstr = dstr_name  
    dstr = 'np.random.{}({})'.format(dstr_name, (input("How many datapoints?"))) # for using any distribution need to manipulate here 
                                                                                 # cause number of args are diffrent for diffrent distibutions           
    print(dstr)
    df = eval(dstr)
    print(df)
#     dstr1 = np.random.chisquare(int(input("How many datapoints?")))
#     print(dstr1)
    return plt.hist(df)

# get_rand_dstr('geometric')  
get_rand_dstr('chisquare')
于 2019-11-21T07:08:12.940 回答
1

接受的答案不正确并且不起作用。问题是NumPy 的随机分布采用不同的所需参数,因此传递给所有这些参数有点繁琐,size因为它是一个 kwarg。(这就是为什么接受的解决方案中的示例返回错误数量的样本——只有 1 个,而不是请求的 5 个。这是因为第一个参数chisquaredf,而不是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或“自由度”。其他功能需要其他东西。您可以对这些事情做出假设并包装所有函数调用(就像我在上面所做的那样 for chisquare)......如果这是您想要做的?

于 2019-11-21T04:41:04.970 回答