Cython ValueError: 缓冲区维度错误(期望2,得到3)

4

有一些类似的问题,但没有一个解决我的问题,所以我在这里发布一个新的问题。

当我尝试给一个函数一个三维numpy数组作为输入时,Cython会给我一个错误,告诉我:"ValueError: Buffer has wrong number of dimensions (expected 2, got 3)"。但是当我给它一个二维数组时,它会崩溃(Python停止响应,我认为这是因为我正在尝试对二维数组进行三维矩阵运算)。

然后,我尝试将输入设置为三维数组,但函数仍然期望一个二维数组。我认为我的代码可能有问题,但当我摆脱Cython变量声明并将其作为Python文件运行时,一切都很好。

这是函数声明:

def isfc(np.ndarray[double, ndim=3] multi_activations, int gaussian_variance):
  #cython variable declaration
  cdef int time_len, activations_len, subj_num, timepoint, subj
  cdef np.ndarray[double, ndim=2] correlations_vector, normalized_activations, coefficients,normalized_sum_activations
  cdef np.ndarray[double, ndim=3] c_activations, activations_sum, correlations_mean
  cdef np.ndarray[double, ndim=4] correlations
  cdef np.ndarray gaussian_array, coefficients_sum, coefficient, sigma_activations, sigma_activations_sum

  #assign initial parameters
  **subj_num, activations_len, time_len= multi_activations.shape[0],multi_activations.shape[1],multi_activations.shape[2]**
  coefficients_sum = np.zeros(time_len)
  correlations= np.zeros([subj_num, time_len,activations_len,activations_len])
  correlations_vector = np.zeros([time_len,(activations_len * (activations_len-1) / 2)])
  coefficients = np.zeros([time_len, activations_len,time_len])
  gaussian_array = np.array([exp(-timepoint**2/2/gaussian_variance)/sqrt(2*pi*gaussian_variance) for timepoint in range(-time_len+1,time_len)])
  **c_activations = np.array(multi_activations)**

被讨论的输入是multi_activations,在**标记线上使用,然后复制到一个三维cython缓冲区中。我已经缩小错误范围,发现问题出在函数调用时,具体来说就是当我将一个三维数组作为multi_activations输入传递给该函数时。我在函数调用时遇到了错误,而不是在函数内部。它只是一个输入参数的缓冲区大小不匹配问题。希望能得到任何帮助。

1
不要使用代码截图。请将代码作为文本内联发布。 - Arya McCarthy
1
此外,请告诉我们出错的是哪一行。最有帮助的是完整的错误回溯信息。您可能会从[ask]和如何创建[mcve]中受益。 - Arya McCarthy
请添加有问题的代码。有关控制台输出和代码格式,请参阅https://stackoverflow.com/help/how-to-answer。 - guenhter
“它崩溃了”是什么意思?在某些情况下,您会收到ValueError。 - hpaulj
大家好,抱歉。我已经内联发布了代码,并标记了与问题相关的代码。当我说“崩溃”时,我的意思是弹出一个错误消息,显示“Python已停止响应”。我认为这是因为,当我输入一个二维数组而不是三维数组时,我的程序正在尝试对二维数组进行三维Cython操作,这将导致内存错误。 - PSA23
1个回答

1
错误发生在以下行:

coefficients = np.zeros([time_len, activations_len,time_len])

我得到了一个有用的错误信息,指向正确的行。如果你没有得到这个信息,那么很可能是在构建过程中移动或重命名了文件,因此当你运行它时找不到 .pyx 文件。
解决方案要么是将 coefficients 的类型更改为 3D 数组,要么使用 np.zeros 创建一个 2D 数组。
当我传递一个二维数组时,无法重现您的崩溃 - 我只会得到一个“ValueError:缓冲区维度错误”的错误。

1
谢谢!这个有效!我不知道为什么错误中没有显示行号。我不认为我移动了我的pyx文件... - PSA23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接