Буферный протокол 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
,