<p>您可以使用广播创建<code>dataset</code>,只需调用<code>numpy.random.normal</code>。不要使用列表理解,而是将<code>rule</code>设为numpy数组,在表达式中有<code>t</code>的地方使用它,并请求大小为<code>(n, len(rule))</code>的示例:</p>
<pre><code>In [66]: r_mean = 1.0
In [67]: r_vol = 3.0
In [68]: p = 2.0
In [69]: rule = np.array([1.0, 100.0, 10000.0])
In [70]: n = 8
In [71]: dataset = np.random.normal(r_mean/(p*rule), r_vol/rule/np.sqrt(p), size=(n, len(rule)))
In [72]: dataset
Out[72]:
array([[ 7.44295301e-01, -1.57786106e-03, -1.85518458e-04],
[ -2.37293991e+00, -2.27875859e-02, 3.38182239e-04],
[ 2.01362974e+00, 5.93566418e-02, -3.00178175e-04],
[ 2.52533022e+00, 8.15380813e-03, 1.82511343e-04],
[ 7.32980563e-01, 2.67511372e-02, -1.95965258e-04],
[ 2.91958598e+00, -1.36314059e-02, 2.45200175e-04],
[ -4.43329724e+00, -5.85052629e-02, -1.75796458e-04],
[ -2.45005431e-01, -1.68543495e-02, 1.69715542e-04]])
</code></pre>
<p>如果您不确定列是否与参数正确匹配,我们可以测试一个大样本:</p>
<pre><code>In [73]: n = 100000
</code></pre>
<p>创建<code>mu</code>和<code>std</code>,这样我们就可以看到请求的平均值和标准偏差:</p>
<pre><code>In [74]: mu = r_mean/(p*rule)
In [75]: std = r_vol/rule/np.sqrt(p)
</code></pre>
<p>生成数据:</p>
<pre><code>In [76]: dataset = np.random.normal(mu, std, size=(n, len(rule)))
</code></pre>
<p>这是我们要求的<code>mu</code>:</p>
<pre><code>In [77]: mu
Out[77]: array([ 5.00000000e-01, 5.00000000e-03, 5.00000000e-05])
</code></pre>
<p>下面是我们在样本中得到的:</p>
<pre><code>In [78]: dataset.mean(axis=0)
Out[78]: array([ 4.95672937e-01, 5.08624034e-03, 5.02922664e-05])
</code></pre>
<p>以下是所需的标准偏差:</p>
<pre><code>In [79]: std
Out[79]: array([ 2.12132034e+00, 2.12132034e-02, 2.12132034e-04])
</code></pre>
<p>我们得到的是:</p>
<pre><code>In [80]: dataset.std(axis=0)
Out[80]: array([ 2.11258192e+00, 2.12437161e-02, 2.11784163e-04])
</code></pre>