NumPy frombuffer和fromstring的区别是什么
在NumPy中,我们经常需要将Python的字符串或二进制数据转换为NumPy数组。这时候,我们就可以使用NumPy中的fromstring和frombuffer两个函数来完成操作。虽然这两个函数都可以将字符串或者二进制数据转换成NumPy数组,但是它们之间存在一些小差别。在这篇文章中,我们将详细探讨这两个函数所存在的区别。
阅读更多:Numpy 教程
fromstring和frombuffer的语法
在开始介绍两者之间的区别之前,我们先来了解一下它们的语法。
fromstring
numpy.fromstring(string, dtype=float, count=-1, sep='')
这个函数可以把字符串解析成一个NumPy数组,其中:
string: 需要被解析成数组的字符串,必须为字符串类型。dtype: 返回数组的数据类型,默认为 float。count: 解析多少个数据并形成数组,默认为 -1,表示解析全部数据。sep: 分隔符,用于将输入字符串分解成多个元素,缺省的分隔符为空格符。
例如:
import numpy as np
string = '1 2 3 4 5'
np.fromstring(string, sep=' ')
这个例子中,fromstring函数将字符串'1 2 3 4 5'以空格分隔符拆开,然后转换为NumPy数组。
frombuffer
numpy.frombuffer(buffer, dtype=float, count=-1, offset=0)
上述函数可以将二进制数据(比如Python内置的bytes对象)变成NumPy数组,其中:
buffer: 需要被转换成数组的二进制数据,必须为buffer类型,也就是bytearray, bytes, memoryview。dtype: 返回数组的数据类型,默认为float。count: 解析多少个数据并形成数组,默认为 -1,表示解析全部数据。offset: 该参数表示数据在buffer中的起始位置,默认为0。
例如:
import numpy as np
data = bytearray(b'hello numpy')
np.frombuffer(data, dtype='S1')
这个例子中,frombuffer函数将bytearray类型的数据转换为NumPy数组。
fromstring和frombuffer的区别
从语法可以看出,frombuffer和fromstring的主要区别在于输入的数据类型不同。
- fromstring的输入是字符串,是一种Unicode类型数据。
- frombuffer的输入是二进制数据(bytes类型),是一种字节类型数据。
在从字符串转换为二进制数据时,不同的编码产生的二进制数据是不同的。所以,如果input本身是一段ASCII数据,那么就可以使用该字符串直接进行fromstring转换;但如果字符串采用的是其他编码,则需要相应对数据进行编码和解码,以保证正确的数据转换。
此外,frombuffer还支持memoryview类型,这是Python3.x中支持的新类型,可以直接对内存进行访问,有助于提高程序的效率,例如:
import numpy as np
arr = np.arange(10)
memory = memoryview(arr)
np.frombuffer(memory, dtype=int)
这个例子中,frombuffer函数直接从memoryview类型的变量memory中读取数据并转化为NumPy数组。
总结
NumPy中的fromstring和frombuffer函数都能帮我们把一些数据转化为NumPy数组,不同的是,它们所接受的输入类型不同,需要在使用时注意区分。frombuffer还支持memoryview类型,可以很好地提高程序的执行效率。
极客笔记