Weave Inline Typecasting (Python)

наилучшие пожелания на 2013 год!

Я использую переплетение SciPy с моим кодом C ++ для транспонирования огромных матриц (около 200.000 x 15). Это работает как талисман, но у меня есть вопрос о типизировании:

Моя матрица ввода читается из файла, разделенных запятыми и т. Д., Поэтому все записи являются строками, а не числами с плавающей запятой («0,551», а не 0,551). Это не влияет на работу функции транспонирования, но позже мне все равно придется конвертировать определенные строки в массивы с плавающей точкой, поэтому мне было интересно, можно ли это сделать в коде 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)

В этом примере моя маленькая матрица будет транспонирована, а результатом моего примера будет первая строка транспонированной матрицы, преобразованная в массив ntype с плавающей точкой dtype. Может ли это быть сделано в коде C ++ вместо этого? Я пытался использовать double x = (double) lines[j][i] и тому подобное, но это как-то не работает для добавления к объекту py :: list.

4

Решение

Следующее может сделать все, что вы после:

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 как документация состояния. Есть две переменные, определенные weave, которые доступны для использования, out_array а также py_outкоторые имеют тип PyArrayObject* а также PyObject* соответственно.

Я оставил закомментированную альтернативную версию назначения: weave автоматически определяет макросы <VAR>1, <VAR>2, <VAR>3, а также <VAR>4 получить доступ к элементам массивов соответствующего числа измерений.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]