2015-05-23 3 views
2

У меня есть memoryview на numpy массив и хотите скопировать содержимое другого numpy массива в него с помощью этого memoryview:Копировать Numpy массив в memoryview

import numpy as np 
cimport numpy as np 

cdef double[:,::1] test = np.array([[0,1],[2,3]], dtype=np.double) 

test[...] = np.array([[4,5],[6,7]], dtype=np.double) 

Но почему это не возможно? Это заставляет меня говорить

TypeError: only length-1 arrays can be converted to Python scalars Blockquote

Он отлично работает, если я копирую из memoryview в memoryview, или из массива numpynumpy в массив, но как скопировать из numpy массива в memoryview?

+0

Но вы можете скопировать из памяти на 2-й массив, не так ли? – hpaulj

+0

Да, но это неудобно, особенно если операции не выполняются на верхнем уровне отступов. Это означает: создать буфер cdef double [:, :: 1] на верхнем уровне отступа, скопировать на следующем шаге результат np.ndarray в мою память буфера памяти и, наконец, оттуда до моего места назначения памяти. – macmallow

+1

Когда вы связываете память с массивом, вы не копируете его. Вы просто определяете способ использования буфера данных массива. Цель в 'cython' состоит в том, чтобы сделать операции достаточно ясными, чтобы создать эффективный C-код. «Комфорт» программиста (в обычном смысле Python) не является приоритетом. – hpaulj

ответ

2

Этого присваивания:

cdef double[:,::1] test2d = np.array([[0,1],[2,3],[4,5]], dtype=np.double) 
cdef double[:,::1] temp = np.array([[4,5],[6,7]], dtype=np.double) 
test2d[...] = 4 
test2d[:,1] = np.array([5],dtype=np.double) 
test2d[1:,:] = temp 
print np.asarray(test2d) 

отображение

[[ 4. 5.] 
[ 4. 5.] 
[ 6. 7.]] 

Я добавил ответ на https://stackoverflow.com/a/30418422/901925, который использует этот memoryview 'буфер' подход в отступоме контекста.

cpdef int testfunc1c(np.ndarray[np.float_t, ndim=2] A, 
        double [:,:] BView) except -1: 
    cdef double[:,:] CView 
    if np.isnan(A).any(): 
     return -1 
    else: 
     CView = la.inv(A) 
     BView[...] = CView 
     return 1 

Он не выполняет назначение буфера без копирования, которое хотел получить другой плакат, но он по-прежнему является эффективной копией памяти.

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