- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
他们给我的结果似乎是一样的:
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/
要在 Python 中解码来自套接字连接的二进制答案,我会这样做: import numpy as np answer= b"\x80\x8eaS\x00\x00\x00\x00\x01\x00\x0
我正在努力思考 PEP3118 的 numpy 实现。缓冲区访问在 numpy 中究竟是如何工作的。 >>> p = numpy.getbuffer(numpy.arange(10)) >>> p
他们给我的结果似乎是一样的: In [32]: s Out[32]: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
我正在尝试内存映射在另一个进程中创建的文件以用作共享帧缓冲区。我不想复制数据,因为我想使用 PIL ImageDraw 函数来操作映射缓冲区,然后刷新更改。我对 python 和内存映射文件还很陌生。
我正在使用 Python、PIL 和 ctypes 进行图像处理。当我一起破解东西时,我使用 PIL 的 fromstring 函数将像素缓冲区从 ctypes 获取到 PIL 对象中。我只是遍历数组
我必须读取从 dll 返回的 C 结构数组并将其转换为 Numpy 数组。该代码使用 Python 的 cffi 模块。 代码到目前为止有效,但我不知道如何处理 np.frombuffer 提示的结构
我正在解压缩具有许多不同数据类型的大型二进制文件 (~1GB)。我正处于创建循环以隐藏每个字节的早期阶段。我一直在使用 struct.unpack,但最近认为如果我使用 numpy 它会运行得更快。然
我正在将一个 numpy 图像从 BGR 格式转换为 RBG 格式,并且该图像正在被转换为 wx.Bitmap 图像,但在这样做时我收到“ValueError:无效数据缓冲区大小”。对于位图图像。如果
我是一名优秀的程序员,十分优秀!