簡體   English   中英

在Python 2.7中編織內聯C ++代碼

[英]Weave Inline C++ Code in Python 2.7

我正在嘗試重寫此功能:

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-Includes嗎?

我知道,這個問題很舊,但是我認為它仍然很有趣。

假設您使用編織來提高計算速度,並且事先知道輸出的長度,那么建議您在調用inline之前創建結果。 這樣,您可以在python中創建結果變量(非常簡單)。 我也建議使用nd.ndarray作為結果,因為這可以確保您使用正確的數據類型。 您可以使用與迭代列表相同的方式在python中迭代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;
[..]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM