从一个二维数组,创建另一个二维数组,该数组由从原始数组中随机选择的值(行之间不共享的值)组成,而不使用循环
Posted
技术标签:
【中文标题】从一个二维数组,创建另一个二维数组,该数组由从原始数组中随机选择的值(行之间不共享的值)组成,而不使用循环【英文标题】:From a 2d array, create another 2d array composed of randomly selected values from original array (values not shared among rows) without using a loop 【发布时间】:2018-12-30 21:55:36 【问题描述】:要从二维数组中选择随机值,可以使用这个
pool = np.random.randint(0, 30, size=[4,5])
seln = np.random.choice(pool.reshape(-1), 3, replace=False)
print(pool)
print(seln)
>[[29 7 19 26 22]
[26 12 14 11 14]
[ 6 1 13 11 1]
[ 7 3 27 1 12]]
[11 14 26]
pool 需要重新整形为一维向量,因为np.random.choice
无法处理二维对象。因此,为了创建一个由原始二维数组中随机选择的值组成的二维数组,我必须使用循环一次做一行。
pool = np.random.randint(0, 30, size=[4,5])
seln = np.empty([4,3], int)
for i in range(0, pool.shape[0]):
seln[i] =np.random.choice(pool[i], 3, replace=False)
print('pool = ', pool)
print('seln = ', seln)
>pool = [[ 1 11 29 4 13]
[29 1 2 3 24]
[ 0 25 17 2 14]
[20 22 18 9 29]]
seln = [[ 8 12 0]
[ 4 19 13]
[ 8 15 24]
[12 12 19]]
但是,我正在寻找一种并行方法;同时处理所有行,而不是在循环中一次处理一个。
这可能吗?如果不是 numpy,那 Tensorflow 呢?
【问题讨论】:
看看here。也许你可以在这里调整一些逻辑 如果值不是在行之间共享,您可以简单地使用extract_patches_2d。但是您也希望给定行的值也被随机打乱。这为您提供与原始父数组中相同的顺序 那么对于新数组的每一行,您想从池中的相应行中随机选择吗? @yatu:我猜这就是 OP 在标题“(行间不共享的值)”中写的意思 【参考方案1】:这是一种避免for
循环的方法:
pool = np.random.randint(0, 30, size=[4,5])
print(pool)
array([[ 4, 18, 0, 15, 9],
[ 0, 9, 21, 26, 9],
[16, 28, 11, 19, 24],
[20, 6, 13, 2, 27]])
# New array shape
new_shape = (pool.shape[0],3)
# Indices where to randomly choose from
ix = np.random.choice(pool.shape[1], new_shape)
array([[0, 3, 3],
[1, 1, 4],
[2, 4, 4],
[1, 2, 1]])
所以ix
的每一行都是一组随机索引,pool
将从中采样。现在每一行都按照pool
的形状进行缩放,这样在展平的时候就可以采样了:
ixs = (ix.T + range(0,np.prod(pool.shape),pool.shape[1])).T
array([[ 0, 3, 3],
[ 6, 6, 9],
[12, 14, 14],
[16, 17, 16]])
而ixs
可用于从pool
采样:
pool.flatten()[ixs].reshape(new_shape)
array([[ 4, 15, 15],
[ 9, 9, 9],
[11, 24, 24],
[ 6, 13, 6]])
【讨论】:
您在池中的第一行第二行第三行第四行条目与原始数组行值不对应 是的,这只是一个示例数组,我也是随机生成的 每行是否可以有不重复的值?我尝试将代码更改为ix = np.random.choice(pool.shape[1], new_shape, replace=False)
,但我得到ValueError: Cannot take a larger sample than population when 'replace=False'
以上是关于从一个二维数组,创建另一个二维数组,该数组由从原始数组中随机选择的值(行之间不共享的值)组成,而不使用循环的主要内容,如果未能解决你的问题,请参考以下文章