编织内联类型转换(python)
Posted
技术标签:
【中文标题】编织内联类型转换(python)【英文标题】:Weave inline typecasting (python) 【发布时间】:2013-01-08 18:15:34 【问题描述】: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 对象。
【问题讨论】:
我尝试了您的示例,在附件中添加了atof
,即line.append(atof(lines[j][i]))
,效果很好。
你为什么不在这里使用numpy
的内置功能? arr = np.arr([['0.5','0.1'],['0.2','0.2']],dtype=float)
然后转置:arr.T
,尽管您不必转置来获得第一行:arr[:,0]
应该这样做。还有genfromtxt 用于从类似csv 的文件中读取数据...
Numpy 的内置方法太慢了,我尝试过 genfromtxt 和 loadtxt,但它们所花费的时间大约是我的 C++ 算法所用时间的两倍。 @Jaime 这正是我想要的,谢谢!是否也可以将输出作为 numpy 2d 数组而不是 python 列表返回?
【参考方案1】:
以下内容可以完成您所追求的全部工作:
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
的documentation 状态。 weave 定义了两个可供使用的变量out_array
和py_out
,它们的类型分别为PyArrayObject*
和PyObject*
。
我已将分配的替代版本注释掉:weave 自动定义宏 <VAR>1
、<VAR>2
、<VAR>3
和 <VAR>4
以访问相应维数的数组项。
【讨论】:
非常感谢!这确实正是我所需要的,它比我以前尝试过的任何东西都要快。以上是关于编织内联类型转换(python)的主要内容,如果未能解决你的问题,请参考以下文章