[英]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_array
和py_out
,它們分別是PyArrayObject*
和PyObject*
類型。
我已經刪除了賦值的替代版本:編織自動定義宏<VAR>1
, <VAR>2
, <VAR>3
和<VAR>4
來訪問具有相應維數的數組項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.