Python NumPy-frombuffer和fromstring之间有什么区别?

Python NumPy-frombuffer和fromstring之间有什么区别?,python,numpy,Python,Numpy,他们似乎给了我同样的结果: [32]中的:s [32]外[32]中有以下两名男子:一名男子男子:一名男子男子:一名男子男子:一名男子男子:一名男子:一名男子男子:一名男子:一名男子:一名男子:一名男子:一名男子男子:一名男子男子:一名男子男子:一名男子男子:一名男子男子:0 0 0\0\0\0\0 0\0 0\0 0 0\0 0 0 0 0 0 0 0 0\0 0 0 0 0 0\0 0 0 0\0 0 0 0 0 0 0 0 0\0 0 0 0\0 0 0 0 0 0\0 0 0\0 0 0\

他们似乎给了我同样的结果:

[32]中的
:s
[32]外[32]中有以下两名男子:一名男子男子:一名男子男子:一名男子男子:一名男子男子:一名男子:一名男子男子:一名男子:一名男子:一名男子:一名男子:一名男子男子:一名男子男子:一名男子男子:一名男子男子:一名男子男子:0 0 0\0\0\0\0 0\0 0\0 0 0\0 0 0 0 0 0 0 0 0\0 0 0 0 0 0\0 0 0 0\0 0 0 0 0 0 0 0 0\0 0 0 0\0 0 0 0 0 0\0 0 0\0 0 0\0 0 0 0 0 0\0 0\0 0 0 0\0 0 0 0\0 0 0\0 0 0 0 0\0 0 0 0 0 0 0 0\0 0 0\0 0 0 0 0 0 0 0 0\0 0 0 0 0 0 0 0\0 0\0 0 0 0 0 0 0 0 0 0\0 0 0 0 0 0\\\x00\x00\x00'
在[27]中:np.frombuffer(s,dtype=“int8”)
出[27]:
数组([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,  0,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0],数据类型=int8)
在[28]中:np.fromstring(s,dtype=“int8”)
出[28]:
数组([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,  0,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0],数据类型=int8)
In[33]:b=缓冲区(s)
在[34]:b中
出[34]:
在[35]中:np.fromstring(b,dtype=“int8”)
出[35]:
数组([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,  0,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0],数据类型=int8)
在[36]中:np.frombuffer(b,dtype=“int8”)
出[36]:
数组([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,  0,  0, 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0],数据类型=int8)

什么时候应该使用一个与另一个?

从实际角度来看,区别在于:

x = np.fromstring(s, dtype='int8')
将在内存中复制字符串,同时:

x = np.frombuffer(s, dtype='int8')

将直接使用字符串的内存缓冲区,不使用任何*额外内存。如果
buffer
的输入是字符串,那么使用
frombuffer
也将产生只读数组,因为字符串在python中是不可变的

(*忽略用于附加python
ndarray
对象的几个字节的内存——数据的底层内存将被共享。)


如果您不熟悉,它们本质上是C级库公开一块内存以供python使用的一种方式。它基本上是一个python接口,用于对原始内存进行托管访问

如果您使用的是公开缓冲区接口的东西,那么您可能希望使用
frombuffer
。(Python2.x字符串和Python3.x
bytes
公开了缓冲区接口,但您将得到一个只读数组,因为Python字符串是不可变的。)


否则,使用
fromstring
从字符串创建numpy数组。(除非您知道自己在做什么,并且希望严格控制内存使用等)

您读过文档了吗
frombuffer
从缓冲区对象创建一个1d数组,
fromstring
从二进制或字符串表示创建一个1d数组。请编辑
s
的内容。在我的简单示例中,s是字节字符串还是缓冲区无关紧要。感谢提供有关缓冲区对象的背景信息。@joe kington你确定吗np.frombuffer()不生成缓冲区的副本吗?如果我反复运行
buffer(np.frombuffer(buffer,dtype='int8'))
,每次我都会得到一个新的缓冲区位置,并且它总是不同于
buffer
@mfripp-您会得到新的对象(例如,每次都有一个新的ndarray),但它们引用相同的内存。如果要验证这一点,请尝试使用可变的内容(例如
数组.array
)而不是字符串,然后修改内容。您将看到所有的numpy视图和缓冲区都发生了变化。@JoeKington,谢谢。我尝试使用
多处理.Array
作为缓冲区,发现它们使用相同的内存。缓冲区对象的字符串表示似乎有误导性;可能它显示的是变量的位置,而不是底层缓冲区。一个更好的检查方法似乎是
id(buffer[0])
。与@MatthiasFripp的问题相反,您确定
np.fromstring()
会复制数据吗?根据文档,“自版本1.14以来已弃用:如果未提供此参数[
sep
”,
fromstring
在将unicode字符串输入编码为utf-8(python 3)或默认编码(python 2)后,会采用
fromsbuffer
的行为。”这表明,如果未提供
sep
,则功能相同。
x = np.frombuffer(buffer(s), dtype='int8')