Python - 基于相应的掩码数组在数组中排名值

时间:2016-02-28 21:49:22

标签: python scipy

我有两个不同的数组:

values = [[ NaN   3.46677628e+01   2.39846527e+02   6.50530212e+02
    1.75084473e+03]
 [  1.02219486e+01   8.44505539e+01   1.38439526e+03   4.25593896e+03
    4.07225195e+03]
 [  2.91582775e+01   1.73292007e+02   9.09395752e+02   1.85212927e+03
    1.12369495e+03]
 [  1.88855534e+01   6.51165543e+01   1.62291489e+02   1.30152039e+02
    9.58973465e+01]] 

condition = [[0 1 1 1 1]
 [1 1 3 3 1]
 [1 1 3 3 1]
 [1 1 1 1 1]]

我想使用condition创建values的掩码,以便我只能对values 1的条目执行操作。我已成功创建了蒙版,但我不知道如何执行我想要的操作,如上所述。

该操作使用valuesscipy.stats.rank(???, method = 'ordinal')的条目进行排名,其中我使用???表示我不确定该放置在该位置的内容。如果我想在没有掩码的情况下对条目进行排名,我知道我会将values放在我???的位置,但我不想对{{1}的非1值条目进行排名1}}。

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

一种解决方案是首先创建相关数组,例如使用

relevant = [[val[i] for i in range(len(val)) if cond[i]==1] for (val, cond) in zip(values, conditions)]

然后应用您的排序算法。 如果您想一次性对所有值进行排序,可以将列表展平为:

relevant = [x for m in relevant for x in m]

所以这会给你:

>>> values = [[ 0.1, 3.46677628,   2.39846527,   6.50530212, 1.7508447], [  1.02219486 ,  8.44505539  , 1.38439526  , 4.25593896 ]]
>>> conditions = [[0,1,1,1,1],[1133]]
>>> relevant = [[val[i] for i in range(len(val)) if cond[i]==1] for (val,  cond) in zip(values, conditions)]
>>> relevant
[[3.46677628, 2.39846527, 6.50530212, 1.7508447], [1.02219486, 8.44505539]]
>>> relevant = [x for m in relevant for x in m]
>>> relevant
[3.46677628, 2.39846527, 6.50530212, 1.7508447, 1.02219486, 8.44505539]

答案 1 :(得分:1)

您可以遍历子列表以构建新列表,并将其传递给rank()

rank_list=[]
for condition_index, sublist in enumerate(condition):
    for sublist_index, mask in enumerate(sublist):
        If mask==1:
            rank_list.append(values[condition_index][sublist_index])
return scipy.stats.rankdata(rank_list, method="ordinal")