簡體   English   中英

無效類型'float [int]',用於數組下標錯誤並將變量傳遞給scipy.weave.inline

[英]invalid types ‘float[int]’ for array subscript error and passing variables to scipy.weave.inline

我一直在玩Scipy的內聯工具(通過編織)來娛樂,但遇到了一些麻煩。 我的C生銹了,我感覺自己缺少一些簡單的東西。

下面的函數旨在采用3D float32 numpy數組。 我正在使用大量的柵格化大氣數據集,但是這應該適用於任何3D陣列。 然后,這將獲取網格並獲得軸i上每個點j,k的算術平均值(即,如果i是時間軸,j和k是經/緯度,那么我將對每個網格點的時間進行平均)。

我希望我的代碼能夠做到這一點,並避免出現麻木的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)

您可以先在python中創建out數組,然后將其傳遞給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)

您還可以使用Blitz轉換器訪問C ++中的數組。 有關詳細信息,請嘗試使用google:weave.converters.blitz

C不支持out [xj] [xk]這樣的動態數組大小調整。 您要么必須對大小進行硬編碼,要么使用malloc或Weave支持的功能來動態分配數據。

暫無
暫無

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

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