Cython:`numpy`数组的内存视图会丢失`numpy`数组功能?

时间:2015-03-09 02:41:11

标签: python numpy cython

考虑以下示例:

cdef test_function():
    cdef:
        double[:] p1 = np.array([3.2, 2.1])
        double[:] p2 = np.array([0.9, 6.])

    return p1-p2

如果使用,则返回以下错误:

Error compiling Cython file:
------------------------------------------------------------
...
cdef test_function():
    cdef:
        double[:] p1 = np.array([3.2, 2.1])
        double[:] p2 = np.array([0.9, 6.])

    return p1-p2
            ^
------------------------------------------------------------

cython_cell_v3.pyx:354:13: Invalid operand types for '-' (double[:]; double[:])

如果我使用numpy数组初始化内存视图,我该如何使用其功能?我是否必须以某种方式对内存视图进行一些解引用?

1 个答案:

答案 0 :(得分:2)

这有效:

cpdef test_function():
    cdef:
        double[:] p1 = np.array([3.2, 2.1])
        double[:] p2 = np.array([0.9, 6.])

    # return p1-p2
    cdef int I
    I = p1.shape[0]
    for i in range(I):
        p1[i] -= p2[i]
    return np.asarray(p1)
print "Test _function", test_function()

我在数组上进行迭代,就好像它们是' c'阵列。如果没有最终np.asarray,它只会显示

>>> memview.test_function()
<MemoryView of 'ndarray' at 0xb60e772c>

另请参阅中的示例 http://docs.cython.org/src/userguide/memoryviews.html#comparison-to-the-old-buffer-support


我尝试了不同的功能:

cpdef test_function1(x):
    cdef:
        int i, N = x.shape[0]
        double[:] p1 = x
    for i in range(N):
        p1[i] *= p1[i]
    return np.asarray(p1)*2

x = np.arange(10.)
print "test_function1 return", test_function1(x)
print "x after test_function1", x

正如预期的那样,函数xx**2之后。但函数返回的是2*x**2

我直接修改了p1,但也最终修改了x。我认为p1x的视图,但功能较少。 np.asarray(p1)为其提供了numpy功能,因此我可以在其上执行数组*并返回结果(无需进一步修改x)。

如果我完成了以下功能:

out = np.asarray(p1)
out *= 2
return out 

我最终也修改了原始xoutx的一个笨拙的观点。 out的行为类似于数组,因为它是一个数组,而不是因为与x的某些远程链接。