Cython ValueError:缓冲区的维数错误(预期为 2,得到 3)

Posted

技术标签:

【中文标题】Cython ValueError:缓冲区的维数错误(预期为 2,得到 3)【英文标题】:Cython ValueError: Buffer has wrong number of dimensions (expected 2, got 3) 【发布时间】:2017-10-19 01:35:21 【问题描述】:

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

当我尝试为函数提供 3 维 numpy 数组作为输入时,Cython 给了我一个错误,告诉我:“ValueError:缓冲区的维数错误(预期为 2,得到 3)”。但是当我给它一个二维数组时,它会崩溃(python 停止响应,我认为这是因为我试图对二维数组执行 3 维矩阵运算)。

然后,我尝试将输入排版为 3 维数组,但函数仍需要 2 维数组。我以为我的代码可能有问题,但是当我摆脱 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,它仅在被复制到 3 维 cython 缓冲区之前用于标有 ** 的行。

我已将错误范围缩小到函数调用,特别是当我将 3 维数组作为 multi_activations 输入传递给该函数时。我在函数调用时遇到错误,而不是在函数内。这只是输入参数的缓冲区大小不匹配。 任何帮助将不胜感激

【问题讨论】:

不要使用你的代码截图。将内联代码作为文本发布。 最重要的是,告诉我们错误发生在行。最有帮助的是错误的完整追溯。您可能会受益于How to Ask 以及如何制作minimal reproducible example。 请添加有问题的代码。控制台输出和代码格式请参考***.com/help/how-to-answer “它崩溃了”是什么意思?在一种情况下,您会收到 ValueError。 大家好,很抱歉。我已将代码内联并标记出与问题相关的代码。通过“崩溃”,我的意思是弹出一条错误消息说“python 已停止响应”。我认为这是因为,当我输入 2 维数组而不是 3 维数组时,我的程序正在尝试对 2 维数组执行 3 维 cython 操作,这会导致内存错误 【参考方案1】:

错误发生就行了:

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

我收到一条有用的错误消息,指向正确的行。如果你不这样做,那么很可能你在构建过程中移动或重命名了一个文件,所以在你运行它时它找不到 .pyx 文件。

解决办法是要么将coefficients的类型改为3D数组,要么用np.zeros创建2D数组。


将二维数组传递给它时,我无法重现您的崩溃 - 我只得到一个 ValueError: Buffer has wrong number of dimensions

【讨论】:

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

以上是关于Cython ValueError:缓冲区的维数错误(预期为 2,得到 3)的主要内容,如果未能解决你的问题,请参考以下文章

连接两个 NumPy 数组给出“ValueError:所有输入数组必须具有相同的维数”

ValueError:所有输入数组必须具有相同的维数

Numpy hstack - “ValueError:所有输入数组必须具有相同的维数” - 但它们确实如此

Pandas:缓冲区的维数错误

Python scikits - 缓冲区的维数错误(预期为 1,得到 2)

无法匹配 Keras LSTM 模型所需的维数