Я играл с встроенным инструментом Сципи (через переплетение) для развлечения, но у меня возникли некоторые проблемы.Мой C ржавый, и у меня такое ощущение, что я упускаю что-то простое.
Функция, приведенная ниже, предназначена для работы с массивом 3D float32.Я использую огромный набор атмосферных данных в сетке, но это должно работать с любым трехмерным массивом.Затем он берет сетку и получает среднее арифметическое по оси 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)