gpt4 book ai didi

python - Cython: `numpy` 数组上的内存 View 会丢失 `numpy` 数组功能吗?

转载 作者:行者123 更新时间:2023-12-01 04:48:19 24 4
gpt4 key购买 nike

考虑以下示例:

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 数组来初始化内存 View ,我该如何使用它的功能?我是否必须以某种方式对内存 View 进行一些取消引用?

最佳答案

这有效:

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 的 View ,但功能有所减少。 np.asarray(p1) 赋予它 numpy 功能,因此我可以对其执行数组 * 并返回结果(无需进一步修改x)。

如果我用以下方法完成该功能:

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

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

关于python - Cython: `numpy` 数组上的内存 View 会丢失 `numpy` 数组功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28934485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com