将一组数字转换为numpy,以便将每个数字转换为小于该数字的其他数字

考虑一组数字:


In [8]: import numpy as np


In [9]: x = np.array([np.random.random() for i in range(10)])


In [10]: x

Out[10]: 

array([ 0.62594394,  0.03255799,  0.7768568 ,  0.03050498,  0.01951657,

        0.04767246,  0.68038553,  0.60036203,  0.3617409 ,  0.80294355])

现在,我想这组变换成另一组y以下列方式:每个元素i在x,相应的元素j在y会中的其他元素的数量x,其小于i。例如,上面给出的x看起来像:


In [25]: y

Out[25]: array([ 6.,  2.,  8.,  1.,  0.,  3.,  7.,  5.,  4.,  9.])

现在,我可以使用简单的python循环来做到这一点:


In [16]: for i in range(len(x)):

    ...:     tot = 0

    ...:     for j in range(len(x)):

    ...:         if x[i] > x[j]: tot += 1

    ...:     y[i] = int(tot)

但是,当的长度x很大时,代码将变得非常慢。我想知道是否有任何麻木的魔法可以救出。例如,如果我必须过滤小于的所有元素0.5,我将只使用布尔掩码:


In [19]: z = x[x < 0.5]


In [20]: z

Out[20]: array([ 0.03255799,  0.03050498,  0.01951657,  0.04767246,  0.3617409 ])

可以使用类似的方法来使相同的事情更快地实现吗?


FFIVE
浏览 1061回答 3
3回答

慕雪6442864

这是一种使用np.searchsorted-np.searchsorted(np.sort(x),x)另一个主要基于@Andras Deak's solution使用argsort()-x.argsort().argsort()样品运行-In [359]: xOut[359]:&nbsp;array([ 0.62594394,&nbsp; 0.03255799,&nbsp; 0.7768568 ,&nbsp; 0.03050498,&nbsp; 0.01951657,&nbsp; &nbsp; &nbsp; &nbsp; 0.04767246,&nbsp; 0.68038553,&nbsp; 0.60036203,&nbsp; 0.3617409 ,&nbsp; 0.80294355])In [360]: np.searchsorted(np.sort(x),x)Out[360]: array([6, 2, 8, 1, 0, 3, 7, 5, 4, 9])In [361]: x.argsort().argsort()Out[361]: array([6, 2, 8, 1, 0, 3, 7, 5, 4, 9])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python