为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

FFIVE 2019-12-06 10:41:50
考虑一组数字: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])


查看完整回答
反对 回复 2019-12-06
  • 3 回答
  • 0 关注
  • 1048 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信