考虑使用以下代码创建一个有N个元素的C缓冲区:
请注意,这是与上面不同的缓冲区。`push_function`将`x`中的数据推送到网络上,而`pull_function`从网络中检索数据。两者都是LabStreamingLayer C++库的一部分。 编辑2:如果我可以在将其发送到网络之前重新加载“push”缓冲区到numpy数组中,我认为我可以使其工作。'pull'缓冲区可能是相同的。因此,这里有一个演示上述`ValueError`的MWE。
from ctypes import byref, c_double
N = 3
buffer = (c_double * N)()
# C++ function that fills the buffer byref
pull_function(byref(buffer))
# load buffer in numpy
data = np.frombuffer(buffer, dtype=c_double)
非常好用。但我的问题是 dtype
可能是数字(float、double、int8等)或字符串。
from ctypes import byref, c_char_p
N = 3
buffer = (c_char_p * N)()
# C++ function that fills the buffer byref
pull_function(byref(buffer))
# Load in.. a list?
data = [v.decode("utf-8") for v in buffer]
我怎样才能将那些UTF-8编码的字符串直接加载到numpy数组中呢?np.char.decode
似乎是一个不错的选择,但我无法弄清楚如何使用它。np.char.decode(np.frombuffer(buffer, dtype=np.bytes_))
出现了错误:ValueError: itemsize cannot be zero in type
。
编辑:缓冲区可以从Python API中填充。对应的代码行为:
x = [list of strings]
x = [v.encode("utf-8") for v in x]
buffer = (c_char_p * N)(*x)
push_function(byref(buffer))
请注意,这是与上面不同的缓冲区。`push_function`将`x`中的数据推送到网络上,而`pull_function`从网络中检索数据。两者都是LabStreamingLayer C++库的一部分。 编辑2:如果我可以在将其发送到网络之前重新加载“push”缓冲区到numpy数组中,我认为我可以使其工作。'pull'缓冲区可能是相同的。因此,这里有一个演示上述`ValueError`的MWE。
from ctypes import c_char_p
import numpy as np
x = ["1", "23"]
x = [elt.encode("utf-8") for elt in x]
buffer = (c_char_p * 2)(*x)
np.frombuffer(buffer, dtype=np.bytes_) # fails
[elt.decode("utf-8") for elt in buffer] # works
np.array(["1", "123"])
的dtype为<U3
。 - Mathieu