簡體   English   中英

Cython:numpy數組上的內存視圖會丟失numpy數組功能嗎?

[英]Cython: memory views on `numpy` arrays lose `numpy` array features?

考慮以下示例:

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數組初始化內存視圖,該如何使用其功能? 我是否必須以某種方式在memoryviews上取消引用?

這有效:

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 

我最終也修改了原始x outx上的一個numpy視圖。 out行為就像一個數組,因為它是一個,而不是因為它與x距離很遠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM