我有两个不同的数组:
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
的条目执行操作。我已成功创建了蒙版,但我不知道如何执行我想要的操作,如上所述。
该操作使用values
对scipy.stats.rank(???, method = 'ordinal')
的条目进行排名,其中我使用???
表示我不确定该放置在该位置的内容。如果我想在没有掩码的情况下对条目进行排名,我知道我会将values
放在我???
的位置,但我不想对{{1}的非1值条目进行排名1}}。
任何建议都将受到赞赏。
答案 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")