4

2013年のご多幸をお祈りします!

私はSciPyのウィーブを私のC++コードとインラインで使用して、巨大なマトリックス(約200.000 x 15)を転置しています。それは魅力のように機能しますが、型キャストについて質問があります。

私の入力行列はファイルから読み取られ、コンマ区切りなどであるため、すべてのエントリはfloatではなく文字列です(0.551ではなく「0.551」)。これは転置関数の動作には影響しませんが、後で特定の行をnumpy float配列に変換する必要があるため、代わりにC++コードでこれを実行できるかどうか疑問に思いました。いくつかのコードで説明しましょう:

def transpose(lines, N, x):
    code =  """
            py::list matrix;
            for(int i = 0; i < x; i++) {
                py::list line;
                if(i == 1) { continue; }
                for(int j = 0; j < N; j++) {
                    line.append(lines[j][i]);
                }
                matrix.append(line);
            }
            return_val = matrix;
            """
    return weave.inline(code, ['lines', 'N', 'x'])

matrix = [['0.5','0.1'],['0.2','0.2']]
matrixT = transpose(matrix, len(matrix), len(matrix[0]))
final_result = np.array(matrixT[0], dtype=float)

この例では、私の小さな行列が転置され、私の例の結果は、転置された行列の最初の行がdtypefloatのnumpy配列に変換されます。代わりに、これをC ++コードで実行できますか?私はdouble x = (double) lines[j][i]そのようなものを使ってみましたが、py::listオブジェクトに追加するためにどういうわけか機能しません。

4

1 に答える 1

2

以下はあなたが求めているすべてのことを行うことができます:

def transpose(lines):
    code =  """
            for(int i = 0; i < x; i++) {
                for(int j = 0; j < N; j++) {
                    out[j + i * N] = atof(lines[j][i]);
                    // OUT2(i, j) = atof(lines[j][i]);
                }
            }
            """
    N = len(lines)
    x = len(lines[0])
    out = np.empty((x, N), dtype=np.float64)
    weave.inline(code, ['lines', 'N', 'x', 'out'])
    return out

>>> matrix = [['0.5', '0.1', '0.7'],['0.2','0.2', '0.4']]
>>> matrix
[['0.5', '0.1', '0.7'], ['0.2', '0.2', '0.4']]
>>> transpose(matrix)
array([[ 0.5,  0.2],
       [ 0.1,  0.2],
       [ 0.7,  0.4]])

;6年ほどCを書かずに忘れてしまうことは別outとして、C ++コードの内部で何が起こっているのかを理解するのに多くの問題があり、最終的にはデータ自体へのポインターであり、ドキュメントPyArrayObjectとしてではありません。状態。使用可能なweaveによって定義された2つの変数、およびがあり、それぞれタイプとです。out_arraypy_outPyArrayObject*PyObject*

割り当ての代替バージョンをコメントアウトしたままにしました。weaveはマクロ<VAR>1を自動的<VAR>2に定義し、、、、<VAR>3および<VAR>4対応する次元数の配列の項目にアクセスします。

于 2013-01-09T20:07:08.193 に答える