簡體   English   中英

編織內聯類型轉換(Python)

[英]Weave inline typecasting (python)

2013年最良好的祝願!

我正在將SciPy的編織與我的某些C ++代碼內聯以轉置巨大的矩陣(大約200.000 x 15)。 它的工作原理很吸引人,但我對類型轉換有疑問:

我的輸入矩陣是從文件中讀取,逗號分隔等,因此所有條目都是字符串而不是浮點數(“ 0.551”而不是0.551)。 這不會影響轉置函數的工作方式,但是稍后我仍然必須將某些行轉換為numpy浮點數組,因此我想知道是否可以在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)

在示例中,我的小矩陣將被轉置,示例結果將是轉置矩陣的第一行轉換為dtype float的numpy數組。 可以用C ++代碼代替嗎? 我試過使用double x = (double) lines[j][i]東西,但是以某種方式無法將其附加到py :: list對象。

以下內容可以幫助您完成全部工作:

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作為文檔的狀態。 編織定義了兩個可用的變量out_arraypy_out ,它們分別是PyArrayObject*PyObject*類型。

我已經刪除了賦值的替代版本:編織自動定義宏<VAR>1<VAR>2<VAR>3<VAR>4來訪問具有相應維數的數組項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM