python3 中元素的类型为 “ numpy.bytes_”

在一些框架中,里边的数据的dtype可能是“|S33”等类型, 当查看每一个元素的类型时显示 “numpy.bytes_”, 这时候如何转化为 str 类型呢?
将list每一个元素都decode一下就好了:
segset = np.array([s.decode(‘UTF-8’) for s in segset])

首先这种情况在python2.x 中不会出现,Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,你不能拼接字符串和字节流,也无法在字节流里搜索字符串,也不能将字符串传入参数为字节流的函数。(ref: http://blog.csdn.net/lyb3b3b/article/details/74993327).

科普1 :
字符串在Python内部的表示是unicode编码, 在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘utf8’),表示将utf8编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘utf8’),表示将unicode编码的字符串str2转换成utf8编码。

在python3.5.4 下执行:

a = '中文'
type(a)
<class 'str'>
b = bytes(a, encoding='utf-8') 
type(b)
<class 'bytes'>
b
b'\xe4\xb8\xad\xe6\x96\x87'
#以上是将 中文(str) 转化为 bytes, 存储为 utf-8 编码,utf-8编码是一个中文 3个字节, 所有b共有6个字节。 \x 表示 16 进制。
s = str(b, encoding='utf-8')
s
'中文'
# 以上是将 bytes 转化为 中文(str), 注意要使用相同的编码格式, 否则会报错的。
#当然这里也可以使用decode函数,将bytes转化为字符串, 以下
c = b.decode('utf-8')
c
'中文'
type(c)
<class 'str'>

字符编码转换还云里雾里的,有时间再好好研究一下,还有重点是 u’\uxxxx’ 的这种的, 遇到真的很烦的。

科普2: 顺便说学习一下编码的发展(https://www.zhihu.com/question/23374078):
ANSI 的”Ascii”编码(American Standard Code for Information Interchange,美国信息互换标准代码) 是 8 bit 来 表示一个字节,可以用来表示所有的英文,这时只用到了前127个状态。
随着世界各地都开始用计算机,开始使用128-255状态,加入一些其它的常用的字符从128 到255这一页的字符集被称“扩展字符集”。
计算机发展到中国,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢。我们把那些127号之后的奇异符号们直接取消掉, 并规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。 中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312“。GB2312 是对 ASCII 的中文扩展。
但是中国的汉字太多了,于是我们不得不继续把 GB2312 没有用到的码位找出来老实不客气地用上。 后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字 符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。 于是熟悉的口令诞生了:“一个汉字算两个英文字符,一个汉字时两个字节(byte)”

随着世界各地都有自己的编码之后,变得很混乱,一个叫 ISO (国际标谁化组织)的国际组织决定着手解决这个问题:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号 的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“。 unicode开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是 ISO 就直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原 来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。

NOTE: 如果是unicode编码的系统,没有字符和字节之分了,所有的都是字符,所有的字符都是两个字节,上面的口令在unicode编码的系统中不再适用。

由于unicode对于英文文本的存储会浪费一倍的空间,这是美国人民所接受不了的,浪费大量的存储和流量,于是UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。 UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1(utf8)~4(utf32)个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII 码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是 unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)。

科普结束!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值