# Apply the ufunc outer() function to all pairs of Two-Dimensional Array in Numpy

Apply the ufunc outer() function to all pairs of 2D array. The numpy.ufunc has functions that operate element by element on whole arrays. The ufuncs are written in C (for speed) and linked into Python with NumPy's ufunc facility.

A universal function (or ufunc for short) is a function that operates on ndarrays in an element-byelement fashion, supporting array broadcasting, type casting, and several other standard features. That is, a ufunc is a "vectorized" wrapper for a function that takes a fixed number of specific inputs and produces a fixed number of specific outputs.

## Steps

At first, import the required library &minusl;

import numpy as np

Create two 2D arrays −

arr1 = np.array([[5, 10, 15, 20], [25, 30, 35, 40]])
arr2 = np.array([[7, 14, 21, 28, 35]])

Display the arrays −

print("Array 1...", arr1)
print("Array 2...", arr2)

Get the type of the arrays −

print("Our Array 1 type...", arr1.dtype)
print("Our Array 2 type...", arr2.dtype)

Get the dimensions of the Arrays −

print("Our Array 1 Dimensions...",arr1.ndim)
print("Our Array 2 Dimensions...",arr2.ndim)

Get the shape of the Arrays −

print("Our Array 1 Shape...",arr1.shape)
print("Our Array 2 Shape...",arr2.shape)

Apply the ufunc outer() function to all pairs −

res = np.multiply.outer(arr1, arr2)
print("Result...",res)
print("Shape...",res.shape)

## Example

import numpy as np

# The numpy.ufunc has functions that operate element by element on whole arrays.
# ufuncs are written in C (for speed) and linked into Python with NumPy's ufunc facility

# Create two 2D arrays
arr1 = np.array([[5, 10, 15, 20], [25, 30, 35, 40]])
arr2 = np.array([[7, 14, 21, 28, 35]])

# Display the arrays
print("Array 1...", arr1)
print("Array 2...", arr2)

# Get the type of the arrays
print("Our Array 1 type...", arr1.dtype)
print("Our Array 2 type...", arr2.dtype)

# Get the dimensions of the Arrays
print("Our Array 1 Dimensions...",arr1.ndim)
print("Our Array 2 Dimensions...",arr2.ndim)

# Get the shape of the Arrays
print("Our Array 1 Shape...",arr1.shape)
print("Our Array 2 Shape...",arr2.shape)

# Apply the ufunc outer() function to all pairs
res = np.multiply.outer(arr1, arr2)
print("Result...",res)
print("Shape...",res.shape)

## Output

Array 1...
[[ 5 10 15 20]
[25 30 35 40]]

Array 2...
[[ 7 14 21 28 35]]

Our Array 1 type...
int64

Our Array 2 type...
int64

Our Array 1 Dimensions...
2

Our Array 2 Dimensions...
2

Our Array 1 Shape...
(2, 4)

Our Array 2 Shape...
(1, 5)

Result...
[[[[ 35 70 105 140 175]]

[[ 70 140 210 280 350]]

[[ 105 210 315 420 525]]

[[ 140 280 420 560 700]]]

[[[ 175 350 525 700 875]]

[[ 210 420 630 840 1050]]

[[ 245 490 735 980 1225]]

[[ 280 560 840 1120 1400]]]]

Shape...
(2, 4, 1, 5)