Python 无效类型‘;浮动[int]和#x2019;用于数组下标错误和将变量传递到scipy.weave.inline

Python 无效类型‘;浮动[int]和#x2019;用于数组下标错误和将变量传递到scipy.weave.inline,python,c,numpy,scipy,Python,C,Numpy,Scipy,我一直在玩Scipy的内联工具(通过weave),但我遇到了一些麻烦。我的C已经生锈了,我觉得我错过了一些简单的东西 下面的函数设计用于获取3D float32 numpy阵列。我正在使用大量的网格化大气数据,但这应该适用于任何3D阵列。然后取网格并获得轴i上每个点j,k的算术平均值(即,如果i是时间轴,j和k是lat/lon,则我对每个网格点的时间进行平均) 我希望我的代码能够做到这一点并避免numpy NAN(我相信isnan()在内联C/C++…?)中工作)。但是,无论它是否做到这一点,我

我一直在玩Scipy的内联工具(通过weave),但我遇到了一些麻烦。我的C已经生锈了,我觉得我错过了一些简单的东西

下面的函数设计用于获取3D float32 numpy阵列。我正在使用大量的网格化大气数据,但这应该适用于任何3D阵列。然后取网格并获得轴i上每个点j,k的算术平均值(即,如果i是时间轴,j和k是lat/lon,则我对每个网格点的时间进行平均)

我希望我的代码能够做到这一点并避免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
我想我是在正确地声明和初始化,所以可能有什么东西没有按照我认为的方式传递?如果有人能帮我解决这个问题,我会很高兴的。以下是函数:

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)
从scipy.weave导入内联
def foo(x):
席=NP形状(X)〔0〕
xj=np.形(x)[1]
xk=np.形状(x)[2]
代码=”“
#第87行“tools.py”
int n;
浮出[xj][xk];
对于(int k=0;k
C不支持像out[xj][xk]那样的动态数组大小调整。您必须硬编码大小,或者使用malloc或Weave支持的东西来动态分配数据

> P>你可以先在Python中创建出数组,然后将它传递给C++。在C++中,可以通过NX〔0〕、NX〔1〕、NX〔2〕得到x的形状。您可以使用为数组定义的宏来访问它的元素。例如:X3(k,j,i)与python中的x[k,j,i]相同,OUT2(j,i)与python中的out[j,i]相同。您可以查看自动创建的C++代码,以了解您可以使用哪些变量和宏。获取C++代码文件夹:

from scipy import weave
print weave.catalog.default_dir()
我的编译器不支持isnan(),所以我使用tmp==tmp来检查它

# -*- coding: utf-8 -*-
import scipy.weave as weave
import numpy as np

def foo(x):
    out = np.zeros(x.shape[1:])
    code = """
    int i,j,k,n;
    for(i=0;i<Nx[2];i++)
    {
        for(j=0;j<Nx[1];j++)
        {
            n = 0;
            for(k=0;k<Nx[0];k++)
            {
                double tmp = X3(k,j,i);
                if(tmp == tmp) // if isnan() is not available
                {
                    OUT2(j,i) += tmp;
                    n++;
                }
            }
            OUT2(j,i) /= n;
        }
    }
    """
    weave.inline(code, ["x","out"], headers=["<math.h>"], compiler="gcc")
    return out

np.random.seed(0)    
x = np.random.rand(3,4,5)
x[0,0,0] = np.nan
mx = np.ma.array(x, mask=np.isnan(x))
avg1 = foo(x)
avg2 = np.ma.average(mx, axis=0)
print np.all(avg1 == avg2)
#-*-编码:utf-8-*-
导入scipy.weave作为weave
将numpy作为np导入
def foo(x):
out=np.zero(x.shape[1:]
代码=”“
int i,j,k,n;

对于(i=0;iIsn)这不是我正在做的事情吗?将它xj和xk作为int传递,并使用它们初始化数组?太好了!它很有用!非常方便!我将不得不进一步深入研究它。