自定义numpy类型导致崩溃numpy.平均值

2024-06-11 09:14:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我用C++的基本功能定义了自己的NUMPY类型。数组创建是有效的,并且可以对这种类型的数组进行加法和除法。使用np.sum可以减少数组,但是使用np.mean时解释器崩溃。在

import numpy as np
from example import Dual

x = np.array([Dual(1, 2), Dual(1, 3), Dual(1, 1)])
print(x.dtype)  # dtype(Dual)  -- correct type

# Mean 1
m = x.sum() / x.size
print(m.x, m.y)  # 1.0 2.0  -- correct result

# Mean 2
x.mean()  # -- CRASH
< P>通过在我的C++代码中插入调试输出,我验证了在我的代码中正确计算和和除法(3/3和6/3是实际执行的)。所以函数在计算结果后崩溃了。(Windows告诉我Python停止了工作,所以可能在引擎盖下发生了一个SegFault。)

mean与{}有什么不同?如何修改我的类型使其工作?在

<>我尝试将C++代码煮沸,以创建一个最小的完整的例子。不幸的是,在定义工作numpy类型时,minimal仍然相当长。实现如下:

^{pr2}$

Tags: 代码importnumpy类型定义np数组基本功能
2条回答

回想起来,这个错误非常明显,与实现的numpy部分无关,而是与Python对象的初始化有关。值得称赞的是@hpaulj的评论,这让我走上了正确的道路。在

x.mean和{}都调用np.core._methods.mean,其中崩溃发生在行中

ret = ret.dtype.type(ret / rcount)

这是一个冗余类型转换(至少在我的例子中),它相当于

^{pr2}$

换句话说,调用Dual构造函数时使用Dual的实例作为参数。但是,构造函数的实现需要两个双精度参数:

static char *kwlist[] = {"x", "y", NULL};
if(!PyArg_ParseTupleAndKeywords(args, kwds, "d|d", kwlist, &x, &y))
    return NULL;

当试图强制将Dual强制转换为double时,PyArg_ParseTupleAndKeywords崩溃。这是另一个需要研究的问题,但是最初的问题是通过在构造函数中实现相关的转换来解决的。在

也许这是一个愚蠢的观察,但是你试过:

import numpy as np

###code

np.mean(x)  # instead of x.mean?

According to the documentation:

相关问题 更多 >