我在python中有3个变量(年龄,性别,种族),我想从中创建一个独特的分类二进制代码。首先,年龄是一个整数,我想对每个十年(10-20、20-30、30-40等),性别2值和种族包含4个值设定阈值。如何从三个初始变量中返回完整的分类代码?
答案 0 :(得分:2)
这是一种返回7位代码的方法,其中年龄段的前4位,种族的后2位和性别的前1位。
4位年龄限制了总共只能有16个年龄段,这是合理的,因为它覆盖了0-159岁的年龄段。
4位年龄代码只是整数age//10
的4位表示形式,它有效地将年龄值离散化为以下范围:0-9、10-19,...,150-159
种族和性别的代码只是使用race_dict
和gender_dict
进行硬编码
def get_code(age, race, gender): #returns fixed size 7 bit code
race_dict = {'African':'00','Hispanic':'01','European':'10','Cantonese':'11'}
gender_dict = {'Male':'0','Female':'1'}
age_code = '{0:b}'.format(age//10).zfill(4)
race_code = race_dict[race]
gender_code = gender_dict[gender]
return age_code + race_code + gender_code
输入:年龄:25,种族:“西班牙裔”,性别:“女性”
7位代码:0010011
如果出于代码目的,您希望此代码为0-127之间的整数值,则可以使用int(code_str, 2)
来实现。
编辑:
要从代码字符串获取numpy数组,请使用np_code_arr = np.fromstring(' '.join(list(code_str)), dtype = int, sep = ' ')
答案 1 :(得分:1)
您可以使用n+1+4
维矢量编码。给定您需要的二进制代码,这将是一种实现方法。
您最初的n
个条目将编码十年。 1
(如果它属于那个十年),否则为0
。如果是男性,则下一个(n+1)th
项可能是1
,如果是女性,则可能是0
。同样,对于种族,1
(如果属于该类别),0
(其他)。
比方说,您有多达几十岁的年龄,而100岁以下。对于98岁的男性,白人,假设您从[0 0 0 0 0 0 0 0 1 1 0 1 0 0 0]
年开始到10
,您可以做类似100
的事情。
import numpy as np
def encodeAge(i, n):
ageCode=np.zeros(n)
ageCode[i]=1
return ageCode
n=10 # number of decades
dict_race={'w':[1,0,0,0],'b':[0,1,0,0],'a':[0,0,1,0],'l':[0,0,0,1]} # white, black, asian, latino
dict_age={i:encodeAge(i, n) for i in range(n)}
dict_gender={'m':[1],'f':[0]}
def encodeAll(age, gender, race):
# encode age
code=[]
code=np.concatenate([code, dict_age[age//10]])
# encode gender
code=np.concatenate([code, dict_gender[gender]])
# encode race
code=np.concatenate([code, dict_race[race]])
return code
例如encodeAll(12,'m','w')
将返回array([0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0.])
此编码比建议的其他编码稍长。
答案 2 :(得分:1)
我在这里的答案
年龄 a ,性别 g 和种族 r ,
code = np.array([int(i) for i in "{0:04b}{1:01b}{2:02b}".format(a//10,g,r)])
对于年龄= 58,性别= 1和种族= 3,输出为:
array([0, 1, 0, 1, 1, 1, 1])