Check how many numpy array within a numpy array are equal to other numpy arrays within another numpy array of different size Check how many numpy array within a numpy array are equal to other numpy arrays within another numpy array of different size numpy numpy

Check how many numpy array within a numpy array are equal to other numpy arrays within another numpy array of different size


The numpy_indexed package contains efficient (nlogn, generally) and vectorized solutions to these types of problems:

import numpy_indexed as npicount = len(npi.intersection(a, b))

Note that this is subtly different than your double loop, discarding duplicate entries in a and b for instance. If you want to retain duplicates in b, this would work:

count = npi.in_(b, a).sum()

Duplicate entries in a could also be handled by doing npi.count(a) and factoring in the result of that; but anyway, im just rambling on for illustration purposes since I imagine the distinction probably does not matter to you.


Here is a simple way to do it:

a = np.array([ np.array([1,2]), np.array([3,4]), np.array([5,6]), np.array([7,8]), np.array([9,10])])b = np.array([ np.array([5,6]), np.array([1,2]), np.array([3,192])])count = np.count_nonzero(    np.any(np.all(a[:, np.newaxis, :] == b[np.newaxis, :, :], axis=-1), axis=0))print(count)>>> 2


You can do what you want in one liner as follows:

count = sum([np.array_equal(x,y) for x,y in product(a,b)])

Explanation

Here's an explanation of what's happening:

  1. Iterate through the two arrays using itertools.product which will create an iterator over the cartesian product of the two arrays.
  2. Compare each two arrays in a tuple (x,y) coming from step 1. using np.array_equal
  3. True is equal to 1 when using sum on a list

Full example:

The final code looks like this:

import numpy as np from itertools import product a = np.array([ np.array([1,2]), np.array([3,4]), np.array([5,6]), np.array([7,8]), np.array([9,10])])b = np.array([ np.array([5,6]), np.array([1,2]), np.array([3,192])])count = sum([np.array_equal(x,y) for x,y in product(a,b)])# output: 2