新样式的Python缓冲区协议与numpy数组

3 投票
2 回答
1663 浏览
提问于 2025-04-18 17:33

我正在尝试为我的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, ())

撰写回答