diff --git a/doc/source/reference/c-api.generalized-ufuncs.rst b/doc/source/reference/c-api.generalized-ufuncs.rst index a53228cb54a1..dd8cf6558751 100644 --- a/doc/source/reference/c-api.generalized-ufuncs.rst +++ b/doc/source/reference/c-api.generalized-ufuncs.rst @@ -101,6 +101,7 @@ Dimension Index enumerates the dimension names according to the order of the first occurrence of each name in the signature. +.. _details-of-signature: Details of Signature -------------------- @@ -126,9 +127,9 @@ The formal syntax of signatures is as follows:: ::= ::= nil | | "," ::= "(" ")" - ::= nil | | - "," - ::= valid Python variable name + ::= nil | | + "," + ::= valid Python variable name Notes: diff --git a/doc/source/reference/c-api.ufunc.rst b/doc/source/reference/c-api.ufunc.rst index 79ad256f5eaa..02a35cf56f01 100644 --- a/doc/source/reference/c-api.ufunc.rst +++ b/doc/source/reference/c-api.ufunc.rst @@ -93,12 +93,23 @@ Functions the corresponding 1-d loop function in the func array. :param types: - Must be of length (*nin* + *nout*) \* *ntypes*, and it - contains the data-types (built-in only) that the corresponding - function in the *func* array can deal with. + Length ``(nin + nout) * ntypes`` array of ``char`` encoding the + :ref:`PyArray_Descr.type_num` (built-in only) that the corresponding + function in the ``func`` array accepts. For instance, for a comparison + ufunc with three ``ntypes``, two ``nin`` and one ``nout``, where the + first function accepts :ref:`npy_int32` and the the second + :ref:`npy_int64`, with both returning :ref:`npy_bool`, ``types`` would + be ``(char[]) {5, 5, 0, 7, 7, 0}`` since ``NPY_INT32`` is 5, + ``NPY_INT64`` is 7, and ``NPY_BOOL`` is 0 (on the python side, these + are exposed via :ref:`dtype.num`, i.e., for the example here, + ``dtype(np.int32).num``, ``dtype(np.int64).num``, and + ``dtype(np.bool_).num``, resp.). + + :ref:`casting-rules` will be used at runtime to find the first + ``func`` callable by the input/output provided. :param ntypes: - How many different data-type "signatures" the ufunc has implemented. + How many different data-type-specific functions the ufunc has implemented. :param nin: The number of inputs to this operation. @@ -129,10 +140,11 @@ Functions int nin, int nout, int identity, char* name, char* doc, int unused, char *signature) This function is very similar to PyUFunc_FromFuncAndData above, but has - an extra *signature* argument, to define generalized universal functions. + an extra *signature* argument, to define a + :ref:`generalized universal functions `. Similarly to how ufuncs are built around an element-by-element operation, - gufuncs are around subarray-by-subarray operations, the signature defining - the subarrays to operate on. + gufuncs are around subarray-by-subarray operations, the + :ref:`signature ` defining the subarrays to operate on. :param signature: The signature for the new gufunc. Setting it to NULL is equivalent diff --git a/doc/source/reference/ufuncs.rst b/doc/source/reference/ufuncs.rst index 68d85ccf5081..995542d777e5 100644 --- a/doc/source/reference/ufuncs.rst +++ b/doc/source/reference/ufuncs.rst @@ -424,8 +424,8 @@ advanced usage and will not typically be used. provided by the **types** attribute of the ufunc object. For backwards compatibility this argument can also be provided as *sig*, although the long form is preferred. Note that this should not be confused with - the generalized ufunc signature that is stored in the **signature** - attribute of the of the ufunc object. + the generalized ufunc :ref:`signature ` that is + stored in the **signature** attribute of the of the ufunc object. *extobj* diff --git a/doc/source/user/c-info.ufunc-tutorial.rst b/doc/source/user/c-info.ufunc-tutorial.rst index cfba01c4573f..5818ff182272 100644 --- a/doc/source/user/c-info.ufunc-tutorial.rst +++ b/doc/source/user/c-info.ufunc-tutorial.rst @@ -1057,6 +1057,7 @@ PyUFunc_FromFuncAndData Specification What follows is the full specification of PyUFunc_FromFuncAndData, which automatically generates a ufunc from a C function with the correct signature. +.. seealso:: :c:func:`PyUFunc_FromFuncAndDataAndSignature` .. c:function:: PyObject *PyUFunc_FromFuncAndData( \ PyUFuncGenericFunction* func, void** data, char* types, int ntypes, \ diff --git a/numpy/core/include/numpy/ufuncobject.h b/numpy/core/include/numpy/ufuncobject.h index d0ac1fd7d732..4b1b3d325ba0 100644 --- a/numpy/core/include/numpy/ufuncobject.h +++ b/numpy/core/include/numpy/ufuncobject.h @@ -167,7 +167,7 @@ typedef struct _tagPyUFuncObject { int *core_dim_ixs; /* * positions of 1st core dimensions of each - * argument in core_dim_ixs + * argument in core_dim_ixs, equivalent to cumsum(core_num_dims) */ int *core_offsets; /* signature string for printing purpose */