考虑一组数字:In [8]: import numpy as npIn [9]: x = np.array([np.random.random() for i in range(10)])In [10]: xOut[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]: yOut[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]: zOut[20]: array([ 0.03255799, 0.03050498, 0.01951657, 0.04767246, 0.3617409 ])可以使用类似的方法来使相同的事情更快地实现吗?
3 回答
慕雪6442864
TA贡献1812条经验 获得超5个赞
这是一种使用np.searchsorted-
np.searchsorted(np.sort(x),x)
另一个主要基于@Andras Deak's solution使用argsort()-
x.argsort().argsort()
样品运行-
In [359]: x
Out[359]:
array([ 0.62594394, 0.03255799, 0.7768568 , 0.03050498, 0.01951657,
0.04767246, 0.68038553, 0.60036203, 0.3617409 , 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])
添加回答
举报
0/150
提交
取消