4

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 浮点数的 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 之后不断忘记之外,我在弄清楚outC++ 代码中变成了什么时遇到了很多麻烦,最后它是指向数据本身的指针,而不是文档PyArrayObject中的a状态。weave 定义了两个可供使用的变量,和,它们的类型分别是和。out_arraypy_outPyArrayObject*PyObject*

我留下了一个替代版本的赋值注释:weave 自动定义宏<VAR>1, <VAR>2,<VAR>3<VAR>4来访问相应维数的数组项。

于 2013-01-09T20:07:08.193 回答