Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 优化计算正态分布的NumPy脚本_Python_Numpy - Fatal编程技术网

Python 优化计算正态分布的NumPy脚本

Python 优化计算正态分布的NumPy脚本,python,numpy,Python,Numpy,我编写了下面的numpython测试脚本,以获得某些输入的正态分布。我想我可能没有有效地使用NumPy的向量运算来处理输入数据。 你能告诉我处理输入的基本方法吗 import numpy as np #Inputs mu = np.array( [1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='uint8' ) sigma = np.array( [1., 1., 1., 1., 1., 3., 3., 3., 3., 3.] ) number = np.array( [

我编写了下面的numpython测试脚本,以获得某些输入的正态分布。我想我可能没有有效地使用NumPy的向量运算来处理输入数据。
你能告诉我处理输入的基本方法吗

import numpy as np

#Inputs
mu = np.array( [1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='uint8' )
sigma = np.array( [1., 1., 1., 1., 1., 3., 3., 3., 3., 3.] )
number = np.array( [ 5, 10, 15, 20, 25, 25, 20, 15, 10, 5 ], dtype='uint16' )

#Processing
np.random.seed(0)
norms = [  np.random.normal(i, sigma[n], number[n]) for n, i in enumerate(mu) ]
print( norms )

a = np.concatenate( [ np.ceil(i) for i in norms ] )
print( a )

#Output
result = np.histogram( a, bins=np.arange(np.amin(a), np.amax(a)+1, 1, dtype='uint8' ) )
print( result )

矢量化代码的一种方法是生成随机标准正态样本并相应缩放:

np.random.seed(0)

# random samples
samples = np.random.normal(size=number.sum())

# scale
samples = samples*sigma.repeat(number) + mu.repeat(number)

# equivalent to your `a`
out = np.ceil(samples)

# visualize to compare output:
fig, axes = plt.subplots(1, 2)

axes[0].hist(out, bins=np.arange(out.min(), out.max()+1))
axes[0].set_title('my code')

axes[1].hist(a, bins=np.arange(a.min(), a.max()+1))
axes[1].set_title('yours')
输出:


如果你真的想将其矢量化,你可以做一些类似于maybe的事情。但这看起来没问题。当我以数组的形式构造范数时,我会合并concat操作。正常情况下——这里是偶然的双关语——我们希望从同一个分布,从一个具有固定的
mu
sigma
的分布,进行多次绘制,就像蒙特卡罗模拟一样。因此,Numpy人没有给我们设置一个
np.random.normal
,它将
mu
sigma
的向量值作为输入。我不知道如何使用向量化的
mu
sigma
输入来避免使用循环。在这方面请注意,@pecey提供的链接确实声明性能将与for循环相同。@pecey如链接中所述,
np.vectorize
只是OP已经做过的事情的一个花哨名称。我不知道这一点。谢谢@MikeO'Connor和@Quang。我想对@Mike的评论补充一点。如果我们想要相同数量的值,那么在那里我们可以传递平均值和sd的列表。形状应该是
[示例数,len(means)]
您的
mu
只有9个值,您的
sigma
number
每个值都有10个。是故意的吗?我的错。我也注意到了我问题中的拼写错误尝试了解您的缩放方法,因为这对我来说是新的。你能解释一下吗,或者给我指一份关于它的文档?非常酷…基本上,
N(mu,sigma)~N(0,1)*sigma+mu
。现在,
mu.repeat(number)
重复每个
mu
值对应的
number
时间。因此,
mu.repeat(number)
5
1
10
2
开始。我无法让matplotlib显示正确的结果。我已更新我的问题以显示我的问题。你能告诉我怎么了吗?您的方法更快。@您在我的方法中忘记重置随机种子了吗?尽管柱状图打印输出看起来完全一样。