[英]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.