【发布时间】:2011-09-28 18:32:03
【问题描述】:
我一直在玩 Scipy 的内联工具(通过 weave),但我遇到了一些麻烦。我的 C 生锈了,我感觉我缺少一些简单的东西。
下面的函数设计为采用 3D float32 numpy 数组。我正在使用大量网格化大气数据,但这应该适用于任何 3D 阵列。然后获取网格并获得跨轴 i 的算术平均值,对于每个点 j,k(即,如果 i 是时间轴,j 和 k 是纬度/经度,那么我对每个网格点的时间进行平均)。
我希望我的代码这样做并避免使用 numpy NaN(我相信 isnan() 在内联 C/C++ 中工作......?)。但是,无论是否这样做,我都无法让代码编译而不会出现以下错误:
tools.py: In function ‘PyObject* compiled_func(PyObject*, PyObject*)’:
tools.py:93:45: error: invalid types ‘float[int]’ for array subscript
tools.py:95:51: error: invalid types ‘float[int]’ for array subscript
tools.py: In function ‘PyObject* compiled_func(PyObject*, PyObject*)’:
tools.py:93:45: error: invalid types ‘float[int]’ for array subscript
tools.py:95:51: error: invalid types ‘float[int]’ for array subscript
我认为我正在正确声明和初始化,所以也许某些东西没有按照我认为的方式传递给 weave?如果有人可以帮助我解决这个问题,我会很高兴。这是函数:
from scipy.weave import inline
def foo(x):
xi = np.shape(x)[0]
xj = np.shape(x)[1]
xk = np.shape(x)[2]
code = """
#line 87 "tools.py"
int n;
float out[xj][xk];
for (int k = 0; k < xk; k++) {
for (int j = 0; j < xj; j++) {
n = 0;
for (int i = 0; i < xi; i++) {
if (!isnan(x[i][j][k])) {
n += 1;
out[j][k] += x[i][j][k];
}
}
out[j][k] = out[j][k]/n;
}
}
return_val = out;
"""
awesomeness = inline(code, ['x', 'xi', 'xj', 'xk'], compiler = 'gcc')
return(awesomeness)
【问题讨论】: