[英]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
不出所料,函數x
是x**2
。 但是函數返回的是2*x**2
。
我直接修改了p1
,但最終也修改了x
。 我認為p1
是x
的視圖,但是功能較少。 np.asarray(p1)
為它提供了一個numpy
功能,因此我可以對其執行一個數組*
並返回結果(無需進一步修改x
)。
相反,如果我用以下命令完成了該功能:
out = np.asarray(p1)
out *= 2
return out
我最終也修改了原始x
。 out
是x
上的一個numpy視圖。 out
行為就像一個數組,因為它是一個,而不是因為它與x
距離很遠。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.