создание трехмерного массива из неконтинентального набора смежных 2d-срезов - PullRequest
2 голосов
/ 01 марта 2011

Можно ли использовать PyArray_NewFromDescr для создания объекта массива numpy из набора смежных 2d-массивов без копирования данных?

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Краткий ответ, нет.

Numpy ожидает, что все данные будут изложены в простой пошаговой схеме.При выполнении итерации по массиву для продвижения в измерении он добавляет константу, размер шага для этого измерения, в позицию в памяти.Таким образом, если ваши 2-мерные срезы не размещаются регулярно (например, каждая вторая строка большего 3-мерного массива), numpy потребуется скопировать данные.

Если у вас есть такой порядок, вы можете делатьты захочешь.Вам нужно будет создать структуру PyArray, в которой данные будут указывать на первый элемент, шаги будут правильными для макета, а дескриптор также будет правильным.Самое главное, вы захотите установить базовый член для другого объекта python, чтобы сохранить большой кусок памяти, пока существует это представление.

1 голос
/ 01 марта 2011

В вашем посте есть небольшое несоответствие; Я предполагаю, что ваш заголовок описывает, что вы хотите. Глядя на документы Python API, PyArray_NewFromDescr принимает только один указатель на предварительно выделенную память, поэтому ответ почти наверняка нет. Кажется, вы могли бы быть в состоянии использовать аргумент strides умным способом для достижения этой цели; но даже в этом случае несмежные воспоминания должны были бы быть изложены на регулярной основе.

Более того, это явно не то, что numpy хочет, чтобы вы делали, судя по PyArray_CheckStrides, который, кажется, предполагает один блок непрерывной памяти.

...