Скопируйте массив Numpy в память

У меня есть memoryview на numpy массив и хотите скопировать содержимое другого 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: в скаляры Python могут быть преобразованы только массивы длины-1.

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

1 ответ

Решение

Эти задания работают:

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.]]

Я добавил ответ по адресу /questions/22927653/naznachenie-pustyih-dannyih-v-cython-predstavleniyu/22927671#22927671 котором используется "буферный" подход к просмотру памяти в контексте с отступом.

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

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

Другие вопросы по тегам