我有一个项目,一些嵌套的for-loop拖慢了代码的运行时间,所以我开始实现一些Cython的类型化,它大大加快了循环的运行时间,但我遇到了一个新的问题,我所使用的类型化不允许在其中进行任何计算。这是我代码的模拟草图。
cdef double[:,:] my_matrix = np.zeros([width, height])
for i in range(0,width):
for j in range(0,height):
a = v1[i] - v2[j]
my_matrix[i,j] = np.sqrt(a**2)
然后我想计算以下的乘积: my_matrix
使用
product = constant1 * np.exp(-1j * constant2 * my_matrix) / my_matrix
通过尝试这样做,我得到了一个错误。
TypeError: unsupported operand type(s) for *: 'complex' and 'my_cython_function_cy._memoryviewslice'
我明白这个错误的含义 但我不知道如何将内存视图对象的内容作为一个数组来使用,我试着这样做,
new_matrix = my_matrix
但这无法编译。我是C语言和Cython的新手,文档对这些新手问题帮助不大,所以我将非常感谢任何帮助。
最好的办法是。
new_matrix = np.as_array(my_matrix)
可以让你访问数组上的全部Numpy操作。这应该是一个相当轻量级的转换(它们会共享相同的底层数据)。
你也可以用 my_matrix.base
(这可能是你初始化它的原始Numpy数组)。然而,根据你对slicing所做的工作,这可能和memoryview不太一样,所以对这种方法要谨慎一些。