Python NumPy-frombuffer和fromstring之间有什么区别?
他们似乎给了我同样的结果: [32]中的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\
: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中是不可变的
(*忽略用于附加pythonndarray
对象的几个字节的内存——数据的底层内存将被共享。)
如果您不熟悉,它们本质上是C级库公开一块内存以供python使用的一种方式。它基本上是一个python接口,用于对原始内存进行托管访问 如果您使用的是公开缓冲区接口的东西,那么您可能希望使用
frombuffer
。(Python2.x字符串和Python3.xbytes
公开了缓冲区接口,但您将得到一个只读数组,因为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')