4

同様の質問がいくつかありますが、どれも私の問題に対処していないため、ここに新しい質問を投稿しています。

関数に入力として 3 次元の numpy 配列を指定しようとすると、Cython からエラーが発生し、「ValueError: バッファーの次元数が間違っています (2 が予想され、3 が得られました)」と表示されます。しかし、2 次元配列を与えるとクラッシュします (Python が応答しなくなります。これは、2 次元配列で 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 入力として渡す場合です。関数内ではなく、関数呼び出しでエラーが発生します。これは単に、入力パラメーターのバッファー サイズの不一致です。どんな助けでも大歓迎です

4

1 に答える 1