新样式的Python缓冲区协议与numpy数组
我正在尝试为我的Python绑定一个商业图像处理库,写一个快速的非拷贝接口。我实现了新的缓冲区API协议,使用memoryview()检查后看起来没问题:
import hirsch as H
import numpy as np
w,h = 7,5
img = H.HImage.GenImageConst('byte',w,h)
m = memoryview(img)
print 'ndim shape=',m.ndim,m.shape
# -> 2 (5L, 7L)
我不明白的是,为什么numpy没有识别这个接口?
a = np.array(img)
print 'ndim size shape=',a.ndim,a.size,a.shape
# -> 0 1 ()
我是不是做错了什么,还是说我应该使用numpy数组接口,虽然它能用,但会复制数据?
请注意,我使用的是Python 2.7
2 个回答
0
你也可以试试 np.asarray
。我用这个方法成功过,但我没有办法访问hirsch,所以不能测试一下。
顺便说一下,Bakuriu说得对:你正在创建一个标量数组(维度为0,大小为1),类型是 np.object
。
3
np.array
函数需要一个类似数组的对象,而不是一个缓冲区:
array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
这个函数用来创建一个数组。
object : 类数组对象
可以是一个数组,任何能提供数组接口的对象,或者是一个有__array__
方法返回数组的对象,或者是任何(嵌套的)序列。
如果你想从缓冲区创建一个数组,应该使用 np.frombuffer
:
frombuffer(buffer, dtype=float, count=-1, offset=0)
这个函数把缓冲区当作一维数组来解释。
buffer : 类缓冲区对象
是一个能提供缓冲区接口的对象。
目前来看,你的对象在 numpy 眼里是一个标量:
In [7]: a=np.array(1)
In [8]: a.ndim,a.size,a.shape
Out[8]: (0, 1, ())