为何np.frombuffer示例在Python3.6 Spyder中运行报错?
Why does
np.frombuffer() throw AttributeError with a string in Python 3.6? 这个问题的根源是Python 3和Python 2在字符串类型设计上的核心区别——很多老的NumPy示例都是基于Python 2写的,放到Python 3里就会踩这个坑。
在Python 2中,str本质是字节导向的序列,天然支持缓冲区协议,所以np.frombuffer()可以直接处理它。但到了Python 3,str变成了Unicode字符串,它不再实现__buffer__接口——这就是你看到AttributeError: 'str' object has no attribute '__buffer__'的直接原因。np.frombuffer()的设计初衷是从字节缓冲区(比如bytes、bytearray这类对象)创建数组,Unicode字符串并不符合它的输入要求。
要解决这个问题,只需要把Unicode字符串转换成字节串即可,有两种常用方式:
方式1:直接定义字节串(加b前缀)
import numpy as np s = b'hello world' result = np.frombuffer(s, dtype='S1', count=5, offset=6) print(result) # 输出:array([b'w', b'o', b'r', b'l', b'd'], dtype='|S1')
方式2:用encode()方法转换现有字符串
如果你的字符串是动态生成的(不是硬编码的),可以用encode()把Unicode字符串转成字节串:
import numpy as np s = 'hello world' result = np.frombuffer(s.encode('utf-8'), dtype='S1', count=5, offset=6) print(result) # 输出:array([b'w', b'o', b'r', b'l', b'd'], dtype='|S1')
如果你希望输出是不带b前缀的Unicode字符数组,可以把dtype改成'U1':
import numpy as np s = 'hello world' result = np.frombuffer(s.encode('utf-8'), dtype='U1', count=5, offset=6) print(result) # 输出:array(['w', 'o', 'r', 'l', 'd'], dtype='<U1')
这样就能得到和你预期一致的字符数组了。
内容的提问来源于stack exchange,提问作者ayiyi
相关产品推荐
相关产品推荐

