# Creating Our Own ufunc

We create our own Numpy ufunc (Universal function) like any other normal Python function. It is very simple to create our own ufunc. We just need to add this function to our Numpy ufunc library using frompyfunc() method.

The following arguments are provided to frompyfunc() method,

• function - the function name
• inputs - the number of input arguments (arrays).
• outputs - the number of output arrays.

For example,

```import numpy as np

def multiply(x, y):
return x*y

multiply = np.frompyfunc(multiply, 2, 1)

print(multiply([1, 2, 3, 4], [5, 6, 7, 8]))

#Output
[5 12 21 32]
```

## Testing if a function is a ufunc

An ufunc type returns <class 'numpy.ufunc'>

```import numpy as np

def multiply(x, y):
return x*y

multiply = np.frompyfunc(multiply, 2, 1)

print(type(np.multiply))

#Output
<class 'numpy.ufunc'>
```

## Applications of user-created ufunc

User defined ufunc can be useful for

• N-dimensional looping
• Automatic type-conversions with minimal memory usage
• Optional output arrays

## numpy.frompyfunc()

The syntax of numpy.frompyfunc is

```numpy.frompyfunc(func, nin, nout)
```

It allows us to define an arbitrary Python function as Numpy ufunc,

Here, the following parameters are defined as,

• func (A python function object) represents an arbitrary python function.
• nin (int) represents a number of input arguments to that function.
• nout (int) represents a number of objects returned by that function. This function returns a ufunc function object.
for example,

```import numpy as np

# create an array of numners
arr = np.array([34, 67, 89, 15, 33, 27])

# python str function as ufunc
string_producer = np.frompyfunc(str, 1, 1)

print("Actual array-", arr)
print("Array After converting to a string\n", string_producer(arr))

#Output
Actual array- [34 67 89 15 33 27]
Array After converting to a string
['34' '67' '89' '15' '33' '27']
```