我有一个不允许循环的任务。在我的代码的一部分中,我需要用不同的步骤索引一个numpy数组。哪个numpy函数/操作可以帮助解决这种情况?下面给出一个示例。
lst0 = [1, 2, 3, 4, 5, 6, 7, 8]
lst1 = []
for i in range(3):
lst1.append(lst0[::i+1])
任务的完整描述:
在时间间隔[0,1]上生成样本几何布朗路径。固定µ = 0.2和σ= 0.4,其中子间隔数为N= 2 ^ k。
估计σˆ和µˆ在粗化数据集上,其中仅使用第2 ^ i个数据点,其中i = 0,。 。 。 ,k。
绘制σˆ和µˆ与采样点数量的对数(semilogx)。
不允许循环,请实现所有矢量化的操作。
from p1a import geom_brownian
import numpy as np
if __name__ == '__main__':
k = 10
N = 2 ** k
mu = 0.2
sigma = 0.4
seed = 5
gbm = geom_brownian(N=N + 1, mu=mu, sigma=sigma, seed=seed)
# gbm_matrix = np.array(np.tile(gbm, (k, 1)))
sigma_est_lst = []
mu_est_lst = []
for i in range(k + 1):
dt = 1 / 2 ** i
step = int(N * dt)
s_coarse = gbm[::step]
r_arr = np.diff(np.log(s_coarse))
r_mean = np.mean(r_arr)
sigma_r = np.std(r_arr)
sigma_est = sigma_r / np.sqrt(dt)
mu_est = r_mean / dt + sigma_est ** 2 / 2
sigma_est_lst.append(sigma_est)
mu_est_lst.append(mu_est)
如果我的理解正确,您可以通过以下方式重塑numpy数组的形状,使所得矩阵在同一行或同一列上具有所需的所有值,然后对该特定轴进行切片。
import numpy as np
a = np.arange(16) # N=4
a.reshape(4,-1)[:,0] # every 4 is a new row and take the 0th column
将返回您的array([0, 4, 8, 12])
,即每4个(2 ^ 2 k = 2)值。