将Numpy数组复制到内存视图

5

我有一个numpy数组上的memoryview,想要通过使用这个memoryview将另一个numpy数组的内容复制到它上面:

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)

但为什么这不可能呢?它一直告诉我:

类型错误:只有长度为1的数组可以转换为Python标量 Blockquote

如果我从一个memoryview复制到另一个memoryview,或者从一个numpy数组复制到另一个numpy数组,那么都能正常工作。但如何从numpy数组复制到memoryview


但是你可以从第二个数组的memoryview中复制,对吗? - hpaulj
是的,但这非常不舒服,特别是如果操作不在顶级缩进级别发生。 这意味着: 在顶级缩进级别创建一个cdef double[:,::1]缓冲区,在下一步中将np.ndarray结果复制到我的缓冲区memoryview中,最后从那里复制到我的目标memoryview。 - mneuner
1
当您将memoryview链接到数组时,不会进行“复制”。您只需定义一种使用数组数据缓冲区的方式。在Cython中的目标是使操作足够清晰,以创建高效的C代码。程序员的“舒适度”(通常Python意义下)并不是优先考虑的。 - hpaulj
可能是将numpy数据分配给cython视图的重复问题。 - YXD
1个回答

4

这些任务可以正常工作:

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

它并没有执行其他帖子所需的无复制缓冲区赋值,但仍然是一种高效的内存视图复制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接