bootstrap numpy 二维数组
bootstrap numpy 2D array
我正在尝试通过替换 base
形状为 (4,2) 的二维 numpy 数组按行进行采样,比如 10 次。最终输出应该是一个 3D numpy 数组。
已尝试下面的代码,它有效。但是有没有没有for循环的方法呢?
base=np.array([[20,30],[50,60],[70,80],[10,30]])
print(np.shape(base))
nsample=10
tmp=np.zeros((np.shape(base)[0],np.shape(base)[1],10))
for i in range(nsample):
id_pick = np.random.choice(np.shape(base)[0], size=(np.shape(base)[0]))
print(id_pick)
boot1=base[id_pick,:]
tmp[:,:,i]=boot1
print(tmp)
这是一种矢量化方法 -
m,n = base.shape
idx = np.random.randint(0,m,(m,nsample))
out = base[idx].swapaxes(1,2)
基本思想是我们生成所有可能的索引 np.random.randint
作为 idx
。那将是一个形状为 (m,nsample)
的数组。我们使用此数组沿第一个轴索引输入数组。因此,它选择 base
之外的随机行。要获得形状为 (m,n,nsample)
的最终输出,我们需要交换最后两个轴。
您可以使用 numpy 中的 stack 函数。您的代码将如下所示:
base=np.array([[20,30],[50,60],[70,80],[10,30]])
print(np.shape(base))
nsample=10
tmp = []
for i in range(nsample):
id_pick = np.random.choice(np.shape(base)[0], size=(np.shape(base)[0]))
print(id_pick)
boot1=base[id_pick,:]
tmp.append(boot1)
tmp = np.stack(tmp, axis=-1)
print(tmp)
根据@Divakar 的回答,如果您已经知道这个二维数组的形状,您可以在引导时将其视为 (8,) 一维数组,然后对其进行整形:
m, n = base.shape
flatbase = np.reshape(base, (m*n,))
idxs = np.random.choice(range(8), (numReps, m*n))
bootflats = flatbase[idx]
boots = np.reshape(flatbase, (numReps, m, n))
我正在尝试通过替换 base
形状为 (4,2) 的二维 numpy 数组按行进行采样,比如 10 次。最终输出应该是一个 3D numpy 数组。
已尝试下面的代码,它有效。但是有没有没有for循环的方法呢?
base=np.array([[20,30],[50,60],[70,80],[10,30]])
print(np.shape(base))
nsample=10
tmp=np.zeros((np.shape(base)[0],np.shape(base)[1],10))
for i in range(nsample):
id_pick = np.random.choice(np.shape(base)[0], size=(np.shape(base)[0]))
print(id_pick)
boot1=base[id_pick,:]
tmp[:,:,i]=boot1
print(tmp)
这是一种矢量化方法 -
m,n = base.shape
idx = np.random.randint(0,m,(m,nsample))
out = base[idx].swapaxes(1,2)
基本思想是我们生成所有可能的索引 np.random.randint
作为 idx
。那将是一个形状为 (m,nsample)
的数组。我们使用此数组沿第一个轴索引输入数组。因此,它选择 base
之外的随机行。要获得形状为 (m,n,nsample)
的最终输出,我们需要交换最后两个轴。
您可以使用 numpy 中的 stack 函数。您的代码将如下所示:
base=np.array([[20,30],[50,60],[70,80],[10,30]])
print(np.shape(base))
nsample=10
tmp = []
for i in range(nsample):
id_pick = np.random.choice(np.shape(base)[0], size=(np.shape(base)[0]))
print(id_pick)
boot1=base[id_pick,:]
tmp.append(boot1)
tmp = np.stack(tmp, axis=-1)
print(tmp)
根据@Divakar 的回答,如果您已经知道这个二维数组的形状,您可以在引导时将其视为 (8,) 一维数组,然后对其进行整形:
m, n = base.shape
flatbase = np.reshape(base, (m*n,))
idxs = np.random.choice(range(8), (numReps, m*n))
bootflats = flatbase[idx]
boots = np.reshape(flatbase, (numReps, m, n))