1

numpy 配列を操作するために C++ で Python 拡張機能を作成しました。メモリの問題があります。

拡張機能を呼び出す前に、値が 0 より大きい 3D numpy 配列があります。拡張機能に入ると、次の関数を使用して numpy 配列を取得します。

PyArrayObject * myArray = NULL;

if (!PyArg_ParseTuple(args, "O!", 
    &PyArray_Type,&myArray))  return NULL;

「 !O 」を使用すると、numpy 配列に直接アクセスできるように、python への参照を借用する必要があります。

次に、データにアクセスします。

float * myData = (float *) myArray->data;

int nbFrames =  array -> dimensions[0];
int nbRows =  array -> dimensions[1];
int nbCols =  array -> dimensions[2];

後で、myArray に存在する値がまだ正であることを確認します。

for(int i = 0 ; i < nbFrames; i ++){
    for( int j = 0 ; j < nbRows; j ++){
        for(int k = 0 ; k < nbCols; k++){
            if( myData[ i * nbCols * nbRows + j * nbCols + k ] < 0){
                perror("Value < 0\n");
                exit(1);
            }  
         }
    }
}

そして、値が < 0 の場合に遭遇するたびに、それは「-0.0000」ではなく、「-19.73」です。

では、この種の問題にすでに遭遇した人はいますか、それともどこから来て、どのように解決するかを知っている人はいますか?

4

1 に答える 1

2

この質問を読む人のために、答えは私の質問のコメントでsega_saiによって提供されました。秘訣は、配列が C 連続であることを確認することでした。これを行うには、配列を作成するときにオプション "order = 'C' " を使用できます。たとえば、次のようになります。

a = np.array([1,2,3,4],order='C')

(詳細については、numpy リファレンスを参照してください: http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html ) または、次のようにして ac 連続配列として変換します。

np.ascontiguousarray(a)

(詳細については、numpy リファレンスhttp://docs.scipy.org/doc/numpy/reference/generated/numpy.ascontiguousarray.htmlを参照してください)

于 2013-05-06T12:31:45.397 に答える