gpt4 book ai didi

python - NumPy - frombuffer 和 fromstring 有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 17:02:49 24 4
gpt4 key购买 nike

他们给我的结果似乎是一样的:

In [32]: s
Out[32]: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

In [27]: np.frombuffer(s, dtype="int8")
Out[27]:
array([ 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], dtype=int8)

In [28]: np.fromstring(s, dtype="int8")
Out[28]:
array([ 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], dtype=int8)

In [33]: b = buffer(s)

In [34]: b
Out[34]: <read-only buffer for 0x035F8020, size -1, offset 0 at 0x036F13A0>

In [35]: np.fromstring(b, dtype="int8")
Out[35]:
array([ 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], dtype=int8)

In [36]: np.frombuffer(b, dtype="int8")
Out[36]:
array([ 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], dtype=int8)

什么时候应该使用一个而不是另一个?

最佳答案

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

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

将在内存中复制字符串,同时:

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

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

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

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


如果您不熟悉 buffer objects (memoryview in python3.x) ,它们本质上是 C 级库公开一 block 内存以供在 python 中使用的一种方式。它基本上是一个 python 接口(interface),用于管理对原始内存的访问。

如果您正在使用暴露缓冲区接口(interface)的东西,那么您可能想要使用 frombuffer。 (Python 2.x 字符串和 python 3.x bytes 公开缓冲区接口(interface),但您将获得一个只读数组,因为 python 字符串是不可变的。)

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

关于python - NumPy - frombuffer 和 fromstring 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22236749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com