如何在Cython中使用eview memoryview对象?

问题描述 投票:0回答:1

我有一个项目,一些嵌套的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的新手,文档对这些新手问题帮助不大,所以我将非常感谢任何帮助。

typeerror cython
1个回答
1
投票

最好的办法是。

new_matrix = np.as_array(my_matrix)

可以让你访问数组上的全部Numpy操作。这应该是一个相当轻量级的转换(它们会共享相同的底层数据)。


你也可以用 my_matrix.base (这可能是你初始化它的原始Numpy数组)。然而,根据你对slicing所做的工作,这可能和memoryview不太一样,所以对这种方法要谨慎一些。

© www.soinside.com 2019 - 2024. All rights reserved.