python ACSII编码问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python ACSII编码问题相关的知识,希望对你有一定的参考价值。
def char2pos(c):
if c == '_':
k = 62 # 62 大于号>
return k
k = ord(c)-48# 48 数字0
if k > 9:# k>57 解释ASCII编码中 48~57是0~9
k = ord(c) - 55
if k > 35:# 35+55=90 #90是大写字母 Z
k = ord(c) - 61 #
if k > 61: #61+61=122 #122小写字母 Z
raise ValueError('NO Map')
return k#为什么是减55,减61?
猜测如果给定的字符不是数字,就按一定规则转成数字。(这个规则是什么?能否补充下。)
或者你给出你的需求,看看有没其他更好的实现方法?
补充: 还是看的一头雾水,注释说明的也不是很明白, 还是要看char2pos 这个函数具体要实现什么逻辑了。 大概是如果c是数字,就返回这个数字,如果是字母,就根据他的逻辑算出来一个数字,如果是其他字符(非数字字幕),就报错。另外如果ord(c) 小于48 ,会返回负数,,不知道算不算它的bug。。
反正他这种写法个人感觉不值得推荐,难读。。 参考技术A 相当于是变成 one_hot 编码
# 文本转向量(相当于打标签)
def text2vec(text): # text :随机生成的4个字母或数字的str( 这里为了简单采用的是 4个数字的str)
text_len = len(text) # 4
if text_len > MAX_CAPTCHA: #假如文本的长度大于4个就报错l
raise ValueError('验证码最长4个字符')
#生成一个一维的MAX_CAPTCHA*CHAR_SET_LEN=63*4=252列的全为0的行向量 --> 数组vector (这里全选数组为40列)
vector = np.zeros(MAX_CAPTCHA*CHAR_SET_LEN)
def char2pos(c):
if c =='_':
k = 62
return k
k = ord(c)-48 # 48 --> 数字为0
if k > 9: # ASCII编码中 48~57 --> 0~9
# 这样的目的就是0~9分别对应vector中的前10位,A~Z对应vector中的10~35,a~z 对应vector中的36~61
k = ord(c) - 55 # 65~90为26个大写英文字母
if k > 35:
k = ord(c) - 61 #97~122 为26个小写英文字母
if k > 61:
raise ValueError('No Map')
return k # ps 所有k的取值就是 0~62
for i, c in enumerate(text):
#CHAR_SET_LEN=63但是我们只用到了数组,所有这里的CHAR_SET_LEN=10
idx = i * CHAR_SET_LEN + char2pos(c)
vector[idx] = 1
return vector
#我们这里只用了数字,故vector是下表在0~30中只有一个1其余全为0的标签
#如果用了数字,字母加'-'则,故vector是下表在0~251中只有一个1其余全为0的标签 参考技术B 不同返回值对应不同的字符:0-9对应0-9;10-35对应A-Z;36-51对应a-z
以上是关于python ACSII编码问题的主要内容,如果未能解决你的问题,请参考以下文章