2016-12-13 14 views
1

こんにちは私は計算のスピードを上げるために、pythonコードをcythonに変換しようとしています。私はcdefからcpdefにcythonコード内の複数の配列を返そうとしています。古典的なCに基づいて、ポインタまたはタプルのどちらかを使用できます。サイズが変わるのでタプルを使うことにしました。私は、次のコードがうまくいかないことを知っています。ありがとうございました!Cythonはcdef内でタプルを返しますか?

import numpy as np 
cimport numpy as np 

cdef tuple funA(double[:] X, double[:] Y): 
    cdef int nX, nY, i 
    nX = len(X) 
    nY = len(Y) 

    for i in range(nX): 
     X[i] = X[i]*X[i] 

    for i in range(nY): 
     Y[i] = Y[i]*Y[i] 

    return X,Y 

cpdef Run(double[:] X, double[:] Y) 
    cdef Tuple1, Tuple2 = funA(X,Y) 

    # Do some calculation with Tuple1 and Tuple2 
    # Example 

    cdef int i, nTuple1, nTuple2 

    nTuple1 = len(Tuple1)  
    for i in range(nTuple1): 
     Tuple1[i] = Tuple1[i]**2 

    nTuple2 = len(Tuple2) 
    for i in range(nTuple2): 
     Tuple2[i] = Tuple2[i]/2 

    return Tuple1, Tuple2 

答えて

4

あなたはいくつかのインデントエラーとコロンがありません。しかし実際の問題は次のとおりです。

cdef Tuple1, Tuple2 = funA(X,Y) 

cdefを削除しても問題ありません。それはcdefのようには見えませんし、タプルをアンパックするのはかなり混乱しています。あなたはそれらをPythonオブジェクトとして扱っているので、それは問題ありません。

XYを変更してから実際にはfunAから何も返す必要はありません。

+0

私が提案したようにcdefが削除され、「識別子またはリテラルが必要です」というメッセージが表示されます。あなたは私に例を提供することができますどこcpdefで2つの配列を返す関数funAを呼び出しますか?ありがとうございました! – user4627923

+0

これは前の行にコロンがないためだと思います。 – DavidW

+0

うわー、私は今や馬鹿のように見える。ハハはおかげで仲間になる:-) – user4627923

関連する問題