考虑以下示例:
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数组初始化内存视图,我该如何使用其功能?我是否必须以某种方式对内存视图进行一些解引用?
答案 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
正如预期的那样,函数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
的一个笨拙的观点。 out
的行为类似于数组,因为它是一个数组,而不是因为与x
的某些远程链接。