从列表理解生成Numpy矩阵

2024-03-29 13:19:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的np.array列表:

dataset = [np.random.normal(r_mean/(p*t), r_vol/t/np.sqrt(p), n) \
           for t in rule]

我想把它转换成一个2Dnp.array(即矩阵)。我可以使用np.asarray,但是(我相信)它效率很低。你知道吗

而且,每个np.random.normal(r_mean/(p*t), r_vol/t/np.sqrt(p), n)都是结果矩阵的一列,而不是一行(即,我必须转置np.asarray(dataset))。你知道吗

实现结果的最佳方法是什么?你知道吗


Tags: in列表fornp矩阵randomsqrtmean
2条回答
ds = np.empty((dataset[0].size, len(dataset)), dtype=dataset[0].dtype)
for i in range(ds.shape[1]):
    ds[:, i] = dataset[i]

但是只有在您必须首先预计算dataset列表时才可以这样做。你知道吗

否则使用发电机:

ds = np.empty((n, len(rule)))
dataset = (np.random.normal(r_mean/(p*t), r_vol/t/np.sqrt(p), n) for t in rule)
for i, d in enumerate(dataset):
    ds[:, i] = d

您可以使用广播创建dataset,只需调用numpy.random.normal。不要使用列表理解,而是将rule设为numpy数组,在表达式中有t的地方使用它,并请求大小为(n, len(rule))的示例:

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]])

如果您不确定列是否与参数正确匹配,我们可以测试一个大样本:

In [73]: n = 100000

创建mustd,这样我们就可以看到请求的平均值和标准偏差:

In [74]: mu = r_mean/(p*rule)

In [75]: std = r_vol/rule/np.sqrt(p)

生成数据:

In [76]: dataset = np.random.normal(mu, std, size=(n, len(rule)))

这是我们要求的mu

In [77]: mu
Out[77]: array([  5.00000000e-01,   5.00000000e-03,   5.00000000e-05])

下面是我们在样本中得到的:

In [78]: dataset.mean(axis=0)
Out[78]: array([  4.95672937e-01,   5.08624034e-03,   5.02922664e-05])

以下是所需的标准偏差:

In [79]: std
Out[79]: array([  2.12132034e+00,   2.12132034e-02,   2.12132034e-04])

我们得到的是:

In [80]: dataset.std(axis=0)
Out[80]: array([  2.11258192e+00,   2.12437161e-02,   2.11784163e-04])

相关问题 更多 >