我想使用NumPy C-API编写一个NumPy Gufunc Python扩展,它接受任意维度的两个矩阵,取一个维度的平均值,然后从另一个维度减go 一个结果.最简单的例子是两个带有签名‘(I),(J)->;()’的一维数组,它返回一个标量.
任何附加维度都可以被假定为核心维度,因此是相同的.例如,二维数组签名可能是‘(n,i),(n,j)->;(N)’,其中核心维度是Axis=0,并且将简单地在该轴上循环该函数.以下是我目前掌握的情况:
#include <Python.h>
#include <numpy/arrayobject.h>
#include <numpy/ufuncobject.h>
#include <math.h>
static void mean_diff(char **args,
const npy_intp *dimensions,
const npy_intp* steps,
void* extra) {
npy_intp i;
npy_intp n1 = 0, n2 = 0;
double s1 = 0.0, s2 = 0.0;
char *in1 = args[0], *in2 = args[1], *out = args[2];
npy_intp len1 = dimensions[0], len2 = dimensions[1];
for (i = 0; i < len1; i++) {
double val = *((double *)in1);
if (!isnan(val)) {
s1 += val;
n1++;
}
in1 += steps[0];
}
for (i = 0; i < len2; i++) {
double val = *((double *)in2);
if (!isnan(val)) {
s2 += val;
n2++;
}
in2 += steps[1];
}
double mean1 = (n1 > 0) ? s1 / n1 : 0.0;
double mean2 = (n2 > 0) ? s2 / n2 : 0.0;
*((double *)out) = mean1 - mean2;
}
我的问题是,即使是一组简单的2个一维数组,也只考虑每个数组的第一个元素.例如:
>>> mean_diff([1.,2.,3.,4.], [2.,7.,29.,3.])
-1.0
>>> np.mean([1.,2.,3.,4.]) - np.mean([2.,7.,29.,3.])
-7.75
我认为这与抓取了错误的维度或什么的有关,但我不知道是什么原因.