2013年的祝福!
我正在使用SciPy编织内联我的一些C ++代码来转换大型矩阵(大约200.000 x 15)。它就像一个魅力,但我有一个关于类型转换的问题:
我的输入矩阵是从文件,逗号分隔等中读取的,因此所有条目都是字符串而不是浮点数('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)
在示例中,我的小矩阵将被转置,我的示例结果将是转置矩阵的第一行转换为dtype float的numpy数组。这可以用C ++代码完成吗?我已经尝试过使用double x = (double) lines[j][i]
之类的东西了,但它不知道怎样才能附加到py :: list对象。
答案 0 :(得分: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]])
除了在没有编写任何C之类的6年之后不断忘记;
之后,我在查找out
在C ++代码中变成什么时遇到了很多麻烦,最后它是指向数据本身的指针,而不是指向documentation状态的PyArrayObject
。编织定义的两个变量可供使用,out_array
和py_out
,分别为PyArrayObject*
和PyObject*
类型。
我留下了另一个版本的作品:weave自动定义宏<VAR>1
,<VAR>2
,<VAR>3
和<VAR>4
来访问数组的项目相应的维数。