NumPy参考 >NumPy C-API > UFunc API
UFUNC_ERR_{HANDLER}
{HANDLER}
可以是IGNORE,WARN,RAISE或CALL
UFUNC_{THING}_{ERR}
{THING}
可以是MASK,SHIFT,或FPE和{ERR}
可DIVIDEBYZERO,OVERFLOW,UNDERFLOW,和INVALID。
NPY_LOOP_BEGIN_THREADS
¶在通用功能代码中使用,仅当loop-> obj不为真(即,这不是OBJECT数组循环)时才释放Python GIL 。需要NPY_BEGIN_THREADS_DEF
在变量声明区域中使用。
NPY_LOOP_END_THREADS
¶在通用功能代码中用于重新获取Python GIL(如果发布)(因为loop-> obj不是true)。
PyUFunc_FromFuncAndData
( PyUFuncGenericFunction * func,void ** data,char * 类型,int ntypes,int nin,int nout,int 身份,char * 名称,char * doc, 未使用 int )¶根据所需变量创建一个新的广播通用功能。每个ufunc都围绕着逐元素操作的概念构建。每个ufunc对象都包含指向1-d循环的指针,这些循环为每种受支持的类型实现了基本功能。
注意
该FUNC,数据,类型,名称,和文档参数不被复制PyUFunc_FromFuncAndData
。只要ufunc对象处于活动状态,调用者必须确保不释放这些数组使用的内存。
功能 –
必须为包含
项的长度为ntypes的数组PyUFuncGenericFunction
。这些项是指向具有以下签名的功能的指针,这些功能实际上实现了基础的(逐个元素)功能时间:
void loopfunc(
char** args, npy_intp* dimensions, npy_intp* steps, void* data)
args
指向输入和输出数组的实际数据的指针数组。首先给出输入参数,然后给出输出参数。
尺寸
指向此函数循环的尺寸大小的指针。
脚步
指向要针对每个输入和输出参数跳转到此维中的下一个元素的字节数的指针。
数据
可以与ufunc一起存储的任意数据(额外的参数,函数名称等),将在调用时传递。
这是专门用于添加双打返回双打的func的示例。
static void
double_add(char **args, npy_intp *dimensions, npy_intp *steps,
void *extra)
{
npy_intp i;
npy_intp is1 = steps[0], is2 = steps[1];
npy_intp os = steps[2], n = dimensions[0];
char *i1 = args[0], *i2 = args[1], *op = args[2];
for (i = 0; i < n; i++) {
*((double *)op) = *((double *)i1) +
*((double *)i2);
i1 += is1;
i2 += is2;
op += os;
}
}
data –应该是NULL
或指向大小为ntypes的数组的指针
。该数组可以包含要传递给func数组中相应循环函数的任意额外数据。
类型 –
编码数组中相应功能接受的
(仅限内置)长度数组。例如,对于具有三个,两个和一个的比较ufunc ,其中第一个函数接受,而第二个
函数都返回,则因为,所以
是5、7和0。(nin + nout) * ntypes
char
numpy.dtype.num
func
ntypes
nin
nout
numpy.int32
numpy.int64
numpy.bool_
types
(char[]) {5, 5, 0, 7, 7, 0}
NPY_INT32
NPY_INT64
NPY_BOOL
如果需要NPY_INT32
,
也可以使用位宽名称(例如NPY_COMPLEX128
)。
转换规则将在运行时用于func
通过提供的输入/输出查找第一个
可调用对象。
ntypes – ufunc实现了多少种特定于数据类型的功能。
nin –此操作的输入数量。
nout –输出数量
身份 -要么PyUFunc_One
,PyUFunc_Zero
,
PyUFunc_MinusOne
,或PyUFunc_None
。这指定将空数组传递给ufunc的reduce方法时应返回的内容。特殊值PyUFunc_IdentityValue
只能与PyUFunc_FromFuncAndDataAndSignatureAndIdentity
方法一起使用,以允许将任意python对象用作标识。
name – ufunc的名称,以NULL
终止的字符串表示。指定'add'或'multiply'的名称会在没有给出dtype的情况下为整数类型的归约启用特殊行为。如果输入类型是小于数据类型大小的整数(或布尔)数据numpy.int_
类型,则它将在内部向上转换为numpy.int_
(或
numpy.uint
)数据类型。
doc –允许传入文档字符串以与ufunc一起存储。文档字符串中不应包含函数名称或调用签名,因为它们将由对象动态确定,并且在访问ufunc的__doc__属性时可用。
未使用 –未使用且存在,用于C-API的向后兼容性。
PyUFunc_FromFuncAndDataAndSignature
( PyUFuncGenericFunction * func,void ** data,char * 类型,int ntypes,int nin,int nout,int identity,char * 名称,char * doc,int 未使用,char * signature )¶该函数与上面的PyUFunc_FromFuncAndData非常相似,但是具有一个额外的签名参数,以定义 通用的通用函数。与如何在逐个元素的操作周围构建ufunc相似,gufuncs围绕一个子数组一个子数组操作,签名定义了要对其进行操作的子数组 。
签名 –新gufunc的签名。将其设置为NULL等效于调用PyUFunc_FromFuncAndData。复制了字符串,因此可以释放传入的缓冲区。
PyUFunc_FromFuncAndDataAndSignatureAndIdentity
( PyUFuncGenericFunction * FUNC,无效 **数据,字符 *类型,INT ntypes,诠释 宁,诠释 NOUT,诠释 的身份,字符 *名称,字符 * DOC,INT 未使用的,字符 *签名,的PyObject * identity_value )¶此函数与上面的PyUFunc_FromFuncAndDataAndSignature非常相似,但是具有一个额外的identity_value参数,用于identity
为传递给ufunc时定义一个任意标识PyUFunc_IdentityValue
。
identity_value –新gufunc的身份。必须通过,NULL
除非
identity
参数为PyUFunc_IdentityValue
。将其设置为NULL等效于调用PyUFunc_FromFuncAndDataAndSignature。
PyUFunc_RegisterLoopForType
(PyUFuncObject * ufunc,INT 的用户类型,PyUFuncGenericFunction 功能,INT * arg_types,无效* 数据)¶此功能允许用户在使用任何输入参数作为用户定义的数据类型调用ufunc时,向已创建的ufunc注册1-d循环。为了使ufunc与内置数据类型一起使用,这是必需的。数据类型必须事先已在numpy系统中注册。循环作为函数传递 。此循环可以获取应作为data传递的任意数据。循环所需的数据类型以arg_types的形式传入,该arg_types必须是至少与ufunc-> nargs一样大的内存指针。
PyUFunc_RegisterLoopForDescr
(PyUFuncObject * ufunc,PyArray_Descr * userdtype,PyUFuncGenericFunction 功能,PyArray_Descr ** arg_dtypes,无效* 数据)¶该函数的行为类似于上面的PyUFunc_RegisterLoopForType,不同之处在于它允许用户使用PyArray_Descr对象而不是dtype类型num值来注册1-d循环。这允许为结构化数组数据类型和自定义数据类型(而不是标量数据类型)注册一维循环。
PyUFunc_ReplaceLoopBySignature
(PyUFuncObject * ufunc,PyUFuncGenericFunction newfunc,INT * 签名,PyUFuncGenericFunction * oldfunc )¶替换1-d环给定的匹配签名在已创建的ufunc与新的1-d环newfunc。在oldfunc中返回旧的一维循环函数。成功返回0,失败返回-1。此功能仅适用于内置类型(
PyUFunc_RegisterLoopForType
用于用户定义的类型)。签名是数据类型编号的数组,表示输入,然后是1-d循环假定的输出。
PyUFunc_GenericFunction
(PyUFuncObject * 自我,的PyObject * ARGS,的PyObject * kwds,PyArrayObject ** MPS )¶通用ufunc调用。ufunc作为self传递,ufunc的参数作为args和kwds传递。的MPS参数是的数组
PyArrayObject
的指针,它们的值被丢弃,并且该接收转换后的输入参数,以及所述输出ufunc返回成功时。用户负责管理此数组,并以mps为每个数组接收新的引用。阵列中的总数MPS由下式给出的自 - >宁+ 自 - > NOUT。
成功返回0,错误返回-1。
PyUFunc_checkfperr
( int errmask,PyObject * errobj )[ 源代码)¶IEEE错误标记检查支持的简单接口。该
errmask参数是一个面具UFUNC_MASK_{ERR}
,指示要检查哪些错误的(以及如何检查他们的)位掩码。所述errobj必须是一个Python元组具有两个元素:含有将在错误的任何通信中使用,要么一个可调用Python对象(回叫功能)或名称的字符串Py_None
。仅当UFUNC_ERR_CALL
将其设置为所需的错误检查方法时,才使用可调用对象
。该例程管理GIL,即使释放GIL也可以安全地进行调用。如果确定IEEE兼容硬件中的错误,则返回-1,否则返回0。
PyUFunc_clearfperr
()¶清除IEEE错误标志。
每个ufunc的核心是特定于类型的函数的集合,这些函数定义了每种受支持类型的基本功能。这些功能必须评估基础功能
时间。可能会传入额外的数据,这些额外数据可能会在计算过程中使用。此功能允许将某些常规功能用作这些基本循环功能。常规函数具有将变量指向正确位置并建立函数调用所需的所有代码。常规函数假定要调用的实际函数作为额外数据传入,并使用正确的值对其进行调用。所有这些函数都适合直接放置在PyUFuncObject结构的function成员中存储的函数数组中。
PyUFunc_e_e_As_d_d
( char ** args,npy_intp * 尺寸,npy_intp * 步骤,void * func )¶类型特定的ufunc核心1-d函数,其中的每个计算都是通过调用带有一个输入参数并返回一个输出的函数来获得的。该函数传入
func
。字母与支持的数据类型的dtypechar相对应(e
-一半,f
-浮点,d
-双精度,
g
-长双F
精度,D
-cfloat,-cdouble,
G
-clongdouble)。参数func必须支持相同的签名。_As_X_X变体假定一种数据类型的ndarray,但是将值强制转换为使用具有不同数据类型的基础函数。因此,PyUFunc_f_f_As_d_d
使用数据类型的ndarrays,NPY_FLOAT
但调用C函数,该函数需要double并返回double。
PyUFunc_ee_e_As_dd_d
( char ** args,npy_intp * 尺寸,npy_intp * 步骤,void * func )¶类型特定的ufunc核心1-d函数,其中的每个计算都是通过调用带有两个输入参数并返回一个输出的函数来获得的。调用的基础函数作为func传递。字母对应于通用功能支持的特定数据类型的dtypechar。参数func
必须支持相应的签名。所述_As_XX_X
变体假定一个数据类型的ndarrays但在循环中使用的底层函数采用不同的数据类型的每个迭代投的值。
PyUFunc_OO_O
( char ** args,npy_intp * 尺寸,npy_intp * 步骤,void * func )¶一输入,一输出和两输入,一输出核心1-d函数用于NPY_OBJECT
数据类型。这些函数处理引用计数问题,并在错误时尽早返回。要调用的实际功能是
FUNC,它必须接受签名呼吁对或者对。(PyObject*)
(PyObject*)
PyUFunc_O_O
(PyObject*)(PyObject *,
PyObject *)
PyUFunc_OO_O
PyUFunc_O_O_method
( char ** args,npy_intp * 尺寸,npy_intp * 步骤,void * func )¶通用1-d核心函数假定func是代表输入对象方法的字符串。对于循环的每次迭代,都会从数组中提取Python对象,并调用其func方法,将结果返回到输出数组。
PyUFunc_OO_O_method
( char ** args,npy_intp * 尺寸,npy_intp * 步骤,void * func )¶这个通用的1-d核心函数假定func是一个字符串,表示一个输入参数的方法,该方法采用一个参数。在第一个参数ARGS是其功能被调用时,在第二个参数的方法ARGS是传递给函数的自变量。函数的输出存储在args的第三项中。
PyUFunc_On_Om
( char ** args,npy_intp * 尺寸,npy_intp * 步骤,void * func )¶这是umath.frompyfunc(function,nin,nout)创建的动态ufunc使用的一维核心函数。在这种情况下,func是指向PyUFunc_PyFuncData
具有定义的结构的指针
PyUFunc_PyFuncData
¶typedef struct {
int nin;
int nout;
PyObject *callable;
} PyUFunc_PyFuncData;
在循环的每次迭代中,nin的输入对象与它们的对象阵列提取并放入参数元组,Python的 可调用被调用的输入参数,并且输出NOUT被置于它们的对象阵列。
PY_UFUNC_UNIQUE_SYMBOL
¶NO_IMPORT_UFUNC
¶import_ufunc
( void )¶这些是用于以与访问数组C-API完全相同的方式从扩展模块访问ufunc C-API的常量和函数。在import_ufunc
()函数必须始终(在扩展模块的初始化子程序)被调用。如果您的扩展模块在一个文件中,则仅需这些。如果扩展模块使用多个文件,则其他两个常量很有用。在这种情况下,PY_UFUNC_UNIQUE_SYMBOL
请为代码定义唯一的内容,然后在不包含模块初始化功能但仍需要访问UFUNC API的源文件中,定义PY_UFUNC_UNIQUE_SYMBOL
为先前使用的相同名称,然后再定义NO_IMPORT_UFUNC
。
C-API实际上是一个函数指针数组。此数组由import_ufunc创建(并由全局变量指向)。全局变量或者是静态定义或允许由根据的状态的其他文件中可以看出
PY_UFUNC_UNIQUE_SYMBOL
和NO_IMPORT_UFUNC
。