Python 优化计算正态分布的NumPy脚本
我编写了下面的numpython测试脚本,以获得某些输入的正态分布。我想我可能没有有效地使用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( [
你能告诉我处理输入的基本方法吗
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显示正确的结果。我已更新我的问题以显示我的问题。你能告诉我怎么了吗?您的方法更快。@您在我的方法中忘记重置随机种子了吗?尽管柱状图打印输出看起来完全一样。