Буферный протокол Python нового стиля и массивы

Я пытаюсь написать быстрый не копирующий интерфейс для моей привязки к 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 array, который работает, хотя он копирует данные?

Обратите внимание, что я использую Python 2.7

2 ответа

np.array функция ожидает объект, похожий на массив, а не буфер:

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

Создать массив.

объект: массив_подобный
Массив, любой объект, представляющий интерфейс массива, объект, чей __array__ Метод возвращает массив или любую (вложенную) последовательность.

Если вы хотите создать массив из буфера, вы должны использовать np.frombuffer:

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

Интерпретировать буфер как одномерный массив.

буфер: buffer_like
Объект, который предоставляет интерфейс буфера.

В настоящее время ваш объект, что касается numpy, является скаляром:

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

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

Вы также можете попробовать np.asarray, Я имел успех с этим, но у меня нет доступа к Hirsch, поэтому я не могу проверить это.

Кстати, у Bakuriu все правильно: вы создаете скалярный массив (ndim 0, size 1) типа np.object,

Другие вопросы по тегам