То, что вам нужно, на самом деле невозможно в Cython. Если вам нужно что-то, что работает хорошо, я бы, вероятно, создал структуру C, содержащую соответствующую информацию из представления памяти, а затем использовал ее вместо этого. Это не очень элегантное решение, но оно даст производительность, аналогичную использованию memoryviews; Я бы не рекомендовал делать это общим шаблоном, но если у вас есть разовая проблема, когда ваши данные требуются, тогда все в порядке.
cdef struct FakeMemoryView:
int* data
int stride
int length
Если бы вы были готовы форсировать C смежных воспоминаний (int[::1]
), вы могли бы отказаться от stride
, так как было бы известно, что это один. Данные можно индексировать с помощью var.data[i*var.stride]
. В начале вашей функции вы просматриваете свой список Python, чтобы создать массив этих FakeMemoryView
, а затем с этого момента вы просто используете этот массив:
def function1(list list_of_numpy_arrays):
assert len(list_of_numpy_arrays) == 5
cdef FakeMemoryView new_list[5]
# initialize the list
cdef int[:] mview
for i in range(5):
mview = list_of_numpy_arrays[i]
new_list[i].data = &mview[0]
new_list[i].stride = mview.strides[0]
new_list[i].length = mview.shape[0]
# example access - zero the first lot of data
for i in range(new_list[0].length):
new_list[0].data[i*new_list[0].stride] = 0
Если вы не знаете длину списка заранее, вам нужно самостоятельно обрабатывать память для него с помощью malloc
и free
.
Это решение не обрабатывает подсчет ссылок на массивы Numpy, поэтому вы не должны разрешать освобождение массивов Numpy, удерживая FakeMemoryView
s. Не храните свой массив более чем для одного вызова функции и не начинайте удалять массивы из входного списка.
person
DavidW
schedule
09.07.2019
function1
? 4) Нужно ли вам использовать синтаксис[]
для получения каждого массива numpy или достаточно вызова функции? - person CodeSurgeon   schedule 09.07.2019