从Numpy数组的每一行中选择一个随机样本,不包括负数

时间:2010-06-30 16:08:43

标签: python random numpy

我有一个看起来像

的Numpy数组
>>> a
array([[ 3. ,  2. , -1. ],
       [-1. ,  0.1,  3. ],
       [-1. ,  2. ,  3.5]])

我想随机选择每行的值,但我想从随机抽样中排除-1值。

我目前所做的是:

x=[]
for i in range(a.shape[0]):
    idx=numpy.where(a[i,:]>0)[0]
    idxr=random.sample(idx,1)[0]
    xi=a[i,idxr]
    x.append(xi)

并获取

>>> x
[3.0, 3.0, 2.0]

这对于大型数组来说变得有点慢,我想知道是否有办法有条件地从原始a矩阵中选择随机值而不单独处理每一行。

1 个答案:

答案 0 :(得分:3)

我真的不认为你会在Numpy中发现任何与你所要求的完全相同的内容,所以我决定提供我能想到的优化。

有几件事情可以让这个慢。首先,numpy.where()相当慢,因为它必须检查切片数组中的每个值(也为每一行生成切片),然后生成一个值数组。如果您计划在同一矩阵上反复执行此过程,那么您可以做的最好的事情就是对每一行进行排序。然后,您只需使用二进制搜索来查找正值开始的位置,并使用随机数从中选择一个值。当然,您也可以在使用二进制搜索找到它们之后,将索引存储在正值开始的位置。

如果您不打算多次执行此过程,那么我建议使用Cython来加速numpy.where行。 Cython将允许您不需要将行切片并加速整个过程。

我的最后一个建议是使用random.choice而不是random.sample,除非你真的计划选择大于1的样本大小。