У меня есть функция C ++, которую я хочу, чтобы вы вызывали в Python 2.7.12, выглядя так:
extern "C" {
double* myfunction(double* &y, double* &z,
int a, int b)
{
vector<double> _x;
vector<double> _y;
vector<double> _z;
// Call some external C++ function
cpp_function(_x, _y, _z, a, b);
// Convert vectors back to arrays
double* x = &_x[0]; // or x = _x.data();
y = &_y[0];
z = &_z[0];
return x;
}
}
В основном эта функция принимает в качестве входных данных два целых числа a,b
(плюс некоторые другие данные, которые я пропустил для ясности) и выполняет некоторые вычисления, прежде чем поместить результаты в два массива y, z
и вернуть массив x
размера a*b
.
После построения этой функции в общей библиотеке myfunction.so
я вызываю ее в Python следующим образом:
from ctypes import *
libc = CDLL('myfunction.so')
myfunction = libc.myfunction
myfunction.argtypes = ()
myfunction.restype = POINTER(c_double)
y = c_double()
z = c_double()
a = 18
b = 18
x = myfunction(byref(y), byref(z), c_int(a), c_int(b))
X = np.asarray([x[i] for i in range(a*b)])
X = X.reshape((a, b))
# print sums over colums and over rows
print('sum over col')
print(np.sum(X, axis=0))
print('sum over row')
print(np.sum(X, axis=1))
Сумма каждого столбца, а также каждой строки X
должна составлять 1.
Запуск скрипта Python, который я получил:
сумма над столбцом
[1.00000000e + 000 1.38691247e-309 1.65267271e-315
1.25888994e-315
6.28349788e-316 1.44468811e-315 1.00000000e + 000 6.30543835e-316
1.65486616e-315 6.30543094e-316 4.20365893e-316 1.39823788e-315
1.00000000e + 000 4.20363294e-316 1.49114498e-315 6.93457613e-310
1,00000000e + 000 1,28096634e-315]
сумма по ряду
[1.00000000e + 000 1.00000000e + 000 1.00000000e + 000 6.99111970e-316
6.99111495e-316 6.99111021e-316 1.00000000e + 000 6.93459588e-310
3.78325942e-315 2.45135624e-315 3.71670210e-316 5.81849688e-316
5.81849807e-316 3.71670210e-316 5.81849925e-316 5.81850044e-316
6,93456516e-310 5,30598164e-316]
Запуск его второй раз :
сумма над столбцом
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
сумма по ряду
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
Мои данные и моя функция детерминированы . Все запуски, начиная со второго, дали одинаковые результаты. Проблема возникает только при первом запуске (например, если я добавляю комментарий к сценарию и запускаю его снова, проблема возникает).
Эта проблема не возникает в Python 3.5.2 . К сожалению, я должен использовать эту функцию в среде Python 2.7.12: (
Мой вопрос: есть ли решение этой проблемы?
Заранее большое спасибо за помощь!