3

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

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

4

2 回答 2

3

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

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

创建一个数组。

object : array_like
一个数组,任何暴露数组接口的对象,一个__array__方法返回一个数组的对象,或者任何(嵌套的)序列。

如果你想从缓冲区创建一个数组,你应该使用np.frombuffer

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

将缓冲区解释为一维数组。

buffer : buffer_like
暴露缓冲区接口的对象。

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

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

In [8]: a.ndim,a.size,a.shape
Out[8]: (0, 1, ())
于 2014-08-17T07:34:32.127 回答
0

你也可以试试np.asarray。我取得了成功,但我无法访问 hirsch,因此无法对其进行测试。

顺便说一句,Bakuriu 说得对:您正在创建一个类型为 (ndim 0, size 1) 的标量数组np.object

于 2014-08-17T08:20:53.427 回答