2.2.2.1 他们是什么?
- Ufunc在数组的所有元素上进行元素级操作。
例子:
np.add
、np.subtract
、scipy.special
.*, …
- 自动话支持:广播、投射…
- ufunc的作者只提供了元素级操作,Numpy负责剩下的。
- 元素级操作需要在C中实现(或者比如Cython)
2.2.2.1.1 Ufunc的部分
- 由用户提供
In [ ]:
void ufunc_loop(void **args, int *dimensions, int *steps, void *data)
{
/*
* int8 output = elementwise_function(int8 input_1, int8 input_2)
*
* This function must compute the ufunc for many values at once,
* in the way shown below.
*/
char *input_1 = (char*)args[0];
char *input_2 = (char*)args[1];
char *output = (char*)args[2];
int i;
for (i = 0; i < dimensions[0]; ++i) {
*output = elementwise_function(*input_1, *input_2);
input_1 += steps[0];
input_2 += steps[1];
output += steps[2];
}
}
- Numpy部分,由下面的代码创建
In [ ]:
char types[3]
types[0] = NPY_BYTE /* type of first input arg */
types[1] = NPY_BYTE /* type of second input arg */
types[2] = NPY_BYTE /* type of third input arg */
PyObject *python_ufunc = PyUFunc_FromFuncAndData(
ufunc_loop,
NULL,
types,
1, /* ntypes */
2, /* num_inputs */
1, /* num_outputs */
identity_element,
name,
docstring,
unused)
- ufunc也可以支持多种不同输入输出类型组合。
2.2.2.1.2 简化一下
ufunc_loop
是非常通用的模式,Numpy提供了预制
PyUfunc_f_f | float elementwise_func(float input_1) |
PyUfunc_ff_f | float elementwise_func(float input_1, float input_2) |
PyUfunc_d_d | double elementwise_func(double input_1) |
PyUfunc_dd_d | double elementwise_func(double input_1, double input_2) |
PyUfunc_D_D | elementwise_func(npy_cdouble *input, npy_cdouble* output) |
PyUfunc_DD_D | elementwise_func(npy_cdouble *in1, npy_cdouble *in2, npy_cdouble* out) |
- 只有需要提供`elementwise_func`
- ... 除非当你的元素级函数不是上面的形式中的任何一种