Я пытаюсь переписать эту функцию:
def smoothen_fast(heightProfile, travelTime):
smoothingInterval = 30 * travelTime
heightProfile.extend([heightProfile[-1]]*smoothingInterval)
# Get the mean of first `smoothingInterval` items
first_mean = sum(heightProfile[:smoothingInterval]) / smoothingInterval
newHeightProfile = [first_mean]
for i in xrange(len(heightProfile)-smoothingInterval-1):
prev = heightProfile[i] # the item to be subtracted from the sum
new = heightProfile[i+smoothingInterval] # item to be added
# Calculate the sum of previous items by multiplying
# last mean with smoothingInterval
prev_sum = newHeightProfile[-1] * smoothingInterval
new_sum = prev_sum - prev + new
mean = new_sum / smoothingInterval
newHeightProfile.append(mean)
return newHeightProfile
как встроенный код C ++:
import scipy.weave as weave
heightProfile = [0.14,0.148,1.423,4.5]
heightProfileSize = len(heightProfile)
travelTime = 3
code = r"""#include <string.h>
int smoothingInterval = 30 * travelTime;
double *heightProfileR = new double[heightProfileSize+smoothingInterval];
for (int i = 0; i < heightProfileSize; i++)
{
heightProfileR[i] = heightProfile[i];
}
for (int i = 0; i < smoothingInterval; i++)
{
heightProfileR[heightProfileSize+i] = -1;
}
double mean = 0;
for (int i = 0; i < smoothingInterval; i++)
{
mean += heightProfileR[i];
}
mean = mean/smoothingInterval;
double *heightProfileNew = new double[heightProfileSize-smoothingInterval];
for (int i = 0; i < heightProfileSize-smoothingInterval-1; i++)
{
double prev = heightProfileR[i];
double newp = heightProfile[i+smoothingInterval];
double prev_sum = heightProfileNew[i] * smoothingInterval;
double new_sum = prev_sum - prev + newp;
double meanp = new_sum / smoothingInterval;
heightProfileNew[i+1] = meanp;
}
return_val = Py::new_reference_to(Py::Double(heightProfileNew));
"""d = weave.inline(code,['heightProfile','heightProfileSize','travelTime'])
В качестве типа возврата мне нужно heightProfileNew
, Мне нужен доступ к нему, как список в Python позже.
Я смотрю на эти примеры:
http://docs.scipy.org/doc/scipy/reference/tutorial/weave.html
Он продолжает говорить мне, что он не знает Py::
, но в примерах нет Py-включений?
Я знаю, вопрос старый, но я думаю, что он все еще интересен.
Предполагая, что вы используете переплетение для повышения скорости вычислений и заранее знаете длину выходных данных, я предлагаю вам создать результат перед вызовом inline
, Таким образом, вы можете создать переменную результата в Python (очень просто). Я бы также предложил использовать nd.ndarray
в результате, потому что вы уверены, что вы используете правильный тип данных. Вы можете повторить ndarrays
в питоне так же, как вы перебираете списки.
import numpy as np
heightProfileArray = np.array(heightprofile)
# heightProfileArray = np.array(heightprofile, dtype = np.float32) if you want to make shure you have the right datatype. Another choice would be np.float64
resultArray = np.zeros_like(heightProfileArray) # same array size and data type but filled with zeros
[..]
weave.inline(code,['heightProfile','heightProfileSize','travelTime','resultArray'])
for element in resultArray:
print element
В вашем C ++ -коде вы можете просто присвоить значения элементам этого массива:
[..]
resultArray[i+1] = 5.5;
[..]