新型python缓冲协议和numpy数组

新型python缓冲协议和numpy数组,python,python-2.7,numpy,python-c-api,pep3118,Python,Python 2.7,Numpy,Python C Api,Pep3118,我正在尝试为商业图像处理库的python绑定编写一个快速的非复制接口。我实现了新型的缓冲区api协议,根据memoryview()看起来还可以: 我不明白的是,为什么numpy没有捕捉到这个接口 a = np.array(img) print 'ndim size shape=',a.ndim,a.size,a.shape # -> 0 1 () 我是做错了什么,还是应该求助于使用numpy数组接口,虽然它可以复制数据,但仍然可以工作 请注意,我使用的是python 2.7函数np.ar

我正在尝试为商业图像处理库的python绑定编写一个快速的非复制接口。我实现了新型的缓冲区api协议,根据memoryview()看起来还可以:

我不明白的是,为什么numpy没有捕捉到这个接口

a = np.array(img)
print 'ndim size shape=',a.ndim,a.size,a.shape
# -> 0 1 ()
我是做错了什么,还是应该求助于使用numpy数组接口,虽然它可以复制数据,但仍然可以工作


请注意,我使用的是python 2.7

函数
np.array
需要类似数组的对象,而不是缓冲区:

array(object,dtype=None,copy=True,order=None,subok=False,ndmin=0)

创建一个数组

对象:数组_like
一个数组,任何暴露数组接口的对象,一个 对象,该对象的
\uuuuuu数组\uuuuu
方法返回一个数组或任何 (嵌套的)序列

如果要从缓冲区创建数组,应使用
np.frombuffer

frombuffer(buffer,dtype=float,count=-1,offset=0)

将缓冲区解释为一维数组

缓冲区:类似缓冲区的
公开缓冲区接口的对象

目前,就numpy而言,您的对象是标量:

In [7]: a=np.array(1)

In [8]: a.ndim,a.size,a.shape
Out[8]: (0, 1, ())

您也可以尝试
np.asarray
。我在这方面取得了成功,但我没有机会接触美国好施集团,所以我无法测试它


顺便说一句,巴库留说得对:您正在创建一个
np.object

类型的标量数组(ndim 0,大小1)。如果新的缓冲区是标准python接口,我很惊讶np数组不支持它!我发现以下行可以用于转换:
a=np.frombuffer(m.tobytes(),{'i8':'i1'}[m.format])。重塑(m.shape)
。但是它也涉及到在m.tobytes()中复制。新的缓冲区接口在
np.array
中也受支持:
np.array(memoryview(np.array([1,2,3]))。shape==(3,)
。造成差异的原因可能是自定义对象的getbuffer的实现……我最终让它工作起来了。让我困惑的一个问题是,您需要将
copy=False
参数用于
np.array()
以获取对同一内存的引用。可能发生了一些令人惊讶的事情——但如果不知道
bf_getbuffer
bf_releasebuffer
的实现中有什么内容,就很难说出什么内容。新的缓冲区接口应该也适用于Python2.x(实际上:
np.array(memoryview('asd'))==np.array([97115100],dtype=np.uint8)
(还要注意,Numpy数组接口不需要复制数据)
In [7]: a=np.array(1)

In [8]: a.ndim,a.size,a.shape
Out[8]: (0, 1, ())