- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我必须读取从 dll 返回的 C 结构数组并将其转换为 Numpy 数组。该代码使用 Python 的 cffi 模块。
代码到目前为止有效,但我不知道如何处理 np.frombuffer
提示的结构中的成员填充:
ValueError: buffer size must be a multiple of element size
这是我的代码:
from cffi import FFI
import numpy as np
s = '''
typedef struct
{
int a;
int b;
float c;
double d;
} mystruct;
'''
ffi = FFI()
ffi.cdef(s)
res = []
#create array and fill with dummy data
for k in range(2):
m = ffi.new("mystruct *")
m.a = k
m.b = k + 1
m.c = k + 2.0
m.d = k + 3.0
res.append(m[0])
m_arr = ffi.new("mystruct[]", res)
print(m_arr)
# dtype for structured array in Numpy
dt = [('a', 'i4'),
('b', 'i4'),
('c', 'f4'),
('d', 'f8')]
# member size, 20 bytes
print('size, manually', 4 + 4 + 4 + 8)
# total size of struct, 24 bytes
print('sizeof', ffi.sizeof(m_arr[0]))
#reason is member padding in structs
buf = ffi.buffer(m_arr)
print(buf)
x = np.frombuffer(buf, dtype=dt)
print(x)
有什么想法可以干净地处理这个问题吗?
如果我在应该发生填充的 dtype 中添加一个额外的数字,它似乎可以工作:
dt = [('a', 'i4'),
('b', 'i4'),
('c', 'f4'),
('pad', 'f4'),
('d', 'f8')]
为什么填充发生在那里? (Win7,64 位,Python 3.4 64 位)。
但这不是最好的方法。真正的代码要复杂得多而且动态多,所以应该可以以某种方式处理这个问题,对吗?
最佳答案
可能最方便的方法是在 numpy dtype constructor 中使用关键字 align=True
.这将自动进行填充。
dt = [('a', 'i4'),
('b', 'i4'),
('c', 'f4'),
('d', 'f8')]
dt_obj = np.dtype(dt, align=True)
x = np.frombuffer(buf, dtype=dt_obj)
(另见关于结构化数组的 Numpy doc)
关于python - 使用 numpy.frombuffer 读取 cffi.buffer 时如何处理 C 结构中的成员填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48423725/
要在 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:无效数据缓冲区大小”。对于位图图像。如果
我是一名优秀的程序员,十分优秀!