我有一个看起来像
的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
矩阵中选择随机值而不单独处理每一行。
答案 0 :(得分:3)
我真的不认为你会在Numpy中发现任何与你所要求的完全相同的内容,所以我决定提供我能想到的优化。
有几件事情可以让这个慢。首先,numpy.where()
相当慢,因为它必须检查切片数组中的每个值(也为每一行生成切片),然后生成一个值数组。如果您计划在同一矩阵上反复执行此过程,那么您可以做的最好的事情就是对每一行进行排序。然后,您只需使用二进制搜索来查找正值开始的位置,并使用随机数从中选择一个值。当然,您也可以在使用二进制搜索找到它们之后,将索引存储在正值开始的位置。
如果您不打算多次执行此过程,那么我建议使用Cython来加速numpy.where行。 Cython将允许您不需要将行切片并加速整个过程。
我的最后一个建议是使用random.choice而不是random.sample,除非你真的计划选择大于1的样本大小。