从2D数组中,不使用循环就从第1个数组(不在行之间共享的值)创建唯一(非重复)随机选择值的第2个2D数组

时间:2018-12-31 00:19:38

标签: python numpy

这是此问题的后续措施。

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

我正在寻找一种创建2D数组的方法,该数组的行是从另一行中随机选择的唯一值(非重复),而不使用循环。

这是使用循环的一种方法。

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

这里是一种不使用循环的方法,但是,它可以在每一行中多次选择相同的值。

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

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

pool.flatten()[ixs].reshape(new_shape)
array([[ 4, 15, 15],
       [ 9,  9,  9],
       [11, 24, 24],
       [ 6, 13,  6]]) 

我正在寻找一种不使用循环的方法,并且如果选择了行中的特定值,则无法再次选择该值。

1 个答案:

答案 0 :(得分:1)

这里是一种没有显式循环的方法。但是,它需要生成一个原始数组大小的随机数数组。就是说,生成是使用编译后的代码完成的,因此它应该非常快。如果您碰巧会生成两个相同的数字,则可能会失败,但是这种情况的发生率基本上为零。

m,n = 4,5 
pool =  np.random.randint(0, 30, size=[m,n])

new_width = 3
mask = np.argsort(np.random.rand(m,n))<new_width

pool[mask].reshape(m,3)

工作方式: 我们生成一个随机的float数组,并对其进行argsort。默认情况下,将artsort应用于2d数组时,它将沿轴1进行应用,因此argsorted列表的i,j条目的值就是第j条条目的位置如果对第i行进行排序,则会显示第i行。

然后,我们在此数组中找到所有值小于new_width的条目。每行以随机顺序包含数字0,...,n-1,因此恰好其中的new_width小于new_width。这意味着mask的每一行将有new_width个条目,而True的条目数恰好为False,其余的将是new_width(当您在ndarray和标量将其按组件应用)。

最后,将布尔掩码应用于原始数据以从每一行中抓取np.vectorize个条目。

您也可以将DB2zOSDialect : DB2Dialect() 用于循环解决方案,尽管那只是循环的简写。