Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Copy Numpy array to a memoryview

I have a memoryview on a numpy array and want to copy the content of another numpy array into it by using this 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)

But why is this not possible? It keeps me telling

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

It works fine if I copy from a memoryview to a memoryview, or from a numpy array to a numpy array, but how to copy from a numpy array to a memoryview?

like image 416
mneuner Avatar asked Sep 28 '22 20:09

mneuner


1 Answers

These assignments work:

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)

displaying

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

I've added an answer at https://stackoverflow.com/a/30418422/901925 that uses this memoryview 'buffer' approach in a indented context.

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

It doesn't perform the copy-less buffer assignment that the other poster wanted, but it is still an efficient memoryview copy.

like image 116
hpaulj Avatar answered Oct 13 '22 00:10

hpaulj