2013-11-27 6 views
2

http://docs.python.org/2/c-api/buffer.htmlКакое использование «многомерного массива» Py_buffer в 2.x?

INT ndim

Число измерений память представляет как многомерный массив. Если оно равно 0, то шаги и подвыборы должны быть NULL.

Что для этого нужно в реальном мире? Используется ли он для векторных буферов рассеяния?

ответ

3

Использование ndim и shape предназначено в первую очередь для многомерных массивов фиксированной формы. Например, если вы хотите создать что-то вроде NumPy с нуля, вы можете создать его вокруг API-интерфейса буфера. Существуют также варианты, облегчающие работу NumPy, PIL и модулей, которые обертывают типичные библиотеки обработки массивов C и Fortran.

Если вы читаете чуть ниже, следующие два значения говорят «См. complex arrays для получения дополнительной информации». Если вы нажмете эту ссылку, это даст вам пример того, как делать что-то вроде NumPy и описывает, как это работает.

См. Также PEP 3118 для некоторых соображений.

Это не (в первую очередь) для массивов с зубчатой ​​формой, таких как разброс/сбор. В то время как у вас может использовать suboffsets типа PIL для этого, как правило, проще просто использовать список или массив буферов (если вы не пытаетесь взаимодействовать с PIL, конечно).

(старый стиль буфера API сделал поддерживают режим, разработанный специально для рассеивания/сбора, как использование, но она была сброшена в Python 3.x, и осуждается в 2.6+ когда 3.x API был портированном , в основном потому, что никто никогда не использовал его.)

+0

спасибо миллион! Я не хочу разбрасывать/собирать, любую рекомендацию/соответствующую информацию, чтобы начать работу? (подготовка к написанию задач ввода-вывода для работы в сети/файла). – est

+1

@est: Python 2.x не предоставляет API-интерфейсов разброса/сбора. Python 3 имеет ['recvmsg_into'] (http://docs.python.org/3.3/library/socket.html#socket.socket.recvmsg_into) и [' sendmsg'] (http://docs.python.org/ 3.3/library/socket.html # socket.socket.sendmsg) в своих сокетах, но они работают, просто предоставляя итерабельность из 1D буферов («list' of' bytearray's works fine), так что больше ничего не нужно фантазии. Если вы используете некоторую стороннюю библиотеку или 'ctypes'-ing непосредственно для функций, специфичных для платформы, таких как' sendv', то ... ну, у каждого из них будут разные требования. – abarnert

+1

@est: Например, на большинстве платформ * nix с 'sendv' и/или' writev' вам нужно создать массив объектов 'struct iovec', каждый из которых имеет указатель буфера и длину. Ни один тип Python не имеет такой формы, поэтому вам нужно создать его из 'ctypes.Structure'. – abarnert

 Смежные вопросы

  • Нет связанных вопросов^_^