首页 > 解决方案 > Use of numpy.select when conditions and hence choices are too many

问题描述

I have just started using numpy.select() given specific conditions and choices list.

Currently my code looks like this:

conditions = [
    data['column_name'].values == mylist[0],
    data['column_name'].values == mylist[1],
    data['column_name'].values == mylist[2],
    data['column_name'].values == mylist[3],
    data['column_name'].values == mylist[4],
    data['column_name'].values == mylist[5],
    data['column_name'].values == mylist[6]
] 

    choices = [
    data['column_name'].multiply(data['xyz'])*mylist[0]*Price/another_list[0],
    data['column_name'].multiply(data['xyz'])*mylist[1]*Price/another_list[1],
    data['column_name'].multiply(data['xyz'])*mylist[2]*Price/another_list[2],
    data['column_name'].multiply(data['xyz'])*mylist[3]*Price/another_list[3],
    data['column_name'].multiply(data['xyz'])*mylist[4]*Price/another_list[4],
    data['column_name'].multiply(data['xyz'])*mylist[5]*Price/another_list[5],
    data['column_name'].multiply(data['xyz'])*mylist[6]*Price/another_list[6]
]

outcome = np.select(conditions, choices)

What I am trying to find out, is what if I had say 30 conditions and 30 different choices? Do I have to fill conditions and choices lists manually? Is there any shortcut similar to the one below?

conditions = [data['column_name'].values == mylist]

choices = [data['column_name'].multiply(data['xyz'])*mylist*Price/another_list]

outcome = np.select(conditions, choices)

I hope I passed the message, looking forward to your ideas. Thank you

标签: pythonnumpyloopsif-statement

解决方案


No, you don't have to manually add it.

conditions = [data['column_name'].values == i for i in mylist]
choices = [data['column_name'].multiply(data['xyz'])*i*Price/j for i,j in zip(mylist,another_list)]
outcome = np.select(conditions, choices)

This will add conditions and choices automatically for all the elements. Also, if you don't want it over all the elements then can use slices like mylist[:limit] or mylist[::2](even positions) etc.


推荐阅读