Возвращение массива в Python (2.7.12) ctypes: некорректные результаты при первом запуске, без проблем, начиная со второго запуска - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть функция 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: (

Мой вопрос: есть ли решение этой проблемы?

Заранее большое спасибо за помощь!

...