【问题标题】:Copy Numpy array to a memoryview将 Numpy 数组复制到内存视图
【发布时间】:2015-05-23 16:35:39
【问题描述】:

我在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)

但是为什么这不可能呢?它让我告诉你

TypeError: 只有长度为 1 的数组可以转换为 Python 标量 块引用

如果我从memoryview 复制到memoryview,或者从numpy 数组复制到numpy 数组,它工作正常,但是如何从numpy 数组复制到memoryview

【问题讨论】:

  • 但是你可以从第二个数组的内存视图中复制,对吧?
  • 是的,但是这非常不舒服,特别是如果操作没有发生在顶部缩进级别。这意味着:在顶部缩进级别创建一个 cdef double[:,::1] 缓冲区,在下一步中将 np.ndarray 结果复制到我的缓冲区内存视图中,最后从那里复制到我的目标内存视图。
  • 当您将内存视图链接到数组时,您不会copy in。您只需定义一种使用数组数据缓冲区的方式。 cython 的目标是使操作足够清晰以创建高效的 C 代码。程序员的“舒适”(在通常的 Python 意义上)不是优先事项。

标签: numpy cython 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.]]

我在 https://stackoverflow.com/a/30418422/901925 添加了一个答案,它在缩进的上下文中使用了这种 memoryview 'buffer' 方法。

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

它没有执行其他发布者想要的无副本缓冲区分配,但它仍然是一个高效的内存视图副本。

【讨论】:

    猜你喜欢
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 2016-04-07
    • 2011-05-07
    相关资源
    最近更新 更多