is there a method in numpy that verifies if an array is contained in another array?

  • Last Update :
  • Techknowledgy :

Use numpy.isin() to find the elements of a array belongs to another array or not. it returns a boolean array matching the shape of other array where elements are to be searched,Or, pass the boolean output of numpy.isin() in numpy.nonzero() to return the index of elements in 2d array Y that matches the element in 1D array X,Use numpy.isin() to return a boolean array of the same shape as Y that is True where an element of Y is in X and False otherwise,numpy.isin() is an element-wise function version of the python keyword in. It calculates element in array X, broadcasting over 2D array Y only. Returns a boolean array of the same shape as 2D array Y that is True where an element of element is in 1D array X and False otherwise

x = np.random.randint(0, 9, size = (4))
x
Out: array([6, 4, 2, 7])
y = np.random.randint(0, 9, size = (4, 4))
y
Out:
   array([
      [5, 8, 7, 8],
      [3, 2, 2, 3],
      [6, 0, 3, 7],
      [8, 6, 0, 3]
   ])
np.isin(Y, X)
Out:
   array([
      [False, False, True, False],
      [False, True, True, False],
      [True, False, False, True],
      [False, True, False, False]
   ])

Suggestion : 2

We can use one with np.searchsorted -

def isin_seq(a, b):
   # Look
for the presence of b in a,
   while keeping the sequence
sidx = a.argsort()
idx = np.searchsorted(a, b, sorter = sidx)
idx[idx == len(a)] = 0
ssidx = sidx[idx]
return (np.diff(ssidx) == 1).all() & (a[ssidx] == b).all()

Sample runs -

In[42]: isin_seq(a, b) # search
for the sequence b in a
Out[42]: True

In[43]: isin_seq(c, b) # search
for the sequence b in c
Out[43]: False

Another with skimage.util.view_as_windows -

from skimage.util
import view_as_windows

def isin_seq_v2(a, b):
   return (view_as_windows(a, len(b)) == b).all(1).any()

Our methods could benefit with a short-circuiting based one. So, we will use one with numba for performance-efficiency, like so -

from numba
import njit

@njit
def isin_seq_numba(a, b):
   m = len(a)
n = len(b)
for i in range(m - n + 1):
   for j in range(n):
   if a[i + j] != b[j]:
   break
if j == n - 1:
   return True
return False

Suggestion : 3

The np.allclose() method checks if two NumPy arrays are equal or very close to being equal.,To check if two NumPy arrays A and B are equal:,Call .all() method for the result array object to check if the elements are True.,Also, if you want to treat arrays with tiny numeric errors equal, use the np.allclose() function.

1._
(A == B).all()

Instead, you should consider using the built-in np.array_equal() function for good measure.

np.array_equal(A, B)

Here is an example:

import numpy as np

A = np.array([
   [1, 1],
   [2, 2]
])
B = np.array([
   [1, 1],
   [2, 2]
])

equal_arrays = (A == B).all()

print(equal_arrays)

Let’s try to compare two NumPy arrays like you would compare two lists:

import numpy as np

A = np.array([
   [1, 1],
   [2, 2]
])
B = np.array([
   [1, 1],
   [2, 2]
])

print(A == B)

As you can see, the result is a matrix, not a boolean:

[
   [True True]
   [True True]
]

Suggestion : 4

Last Updated : 11 Jul, 2022

YES

Suggestion : 5

When only condition is provided, this function is a shorthand for np.asarray(condition).nonzero(). Using nonzero directly should be preferred, as it behaves correctly for subclasses. The rest of this documentation covers only the case where all three arguments are provided.,Return elements chosen from x or y depending on condition.,An array with elements from x where condition is True, and elements from y elsewhere.,Values from which to choose. x, y and condition need to be broadcastable to some shape.

[xv
   if c
   else yv
   for c, xv, yv in zip(condition, x, y)
]
>>> a = np.arange(10) >>>
   a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>>
   np.where(a < 5, a, 10 * a)
array([0, 1, 2, 3, 4, 50, 60, 70, 80, 90])
>>> np.where([
      [True, False],
      [True, True]
   ],
   ...[
      [1, 2],
      [3, 4]
   ],
   ...[
      [9, 8],
      [7, 6]
   ])
array([
   [1, 8],
   [3, 4]
])
>>> x, y = np.ogrid[: 3,: 4] >>>
   np.where(x < y, x, 10 + y) # both x and 10 + y are broadcast
array([
   [10, 0, 0, 0],
   [10, 11, 1, 1],
   [10, 11, 12, 2]
])
>>> a = np.array([
      [0, 1, 2],
      ...[0, 2, 4],
      ...[0, 3, 6]
   ]) >>>
   np.where(a < 4, a, -1) # - 1 is broadcast
array([
   [0, 1, 2],
   [0, 2, -1],
   [0, 3, -1]
])

Suggestion : 6

The easiest way to create an array is to use the array function. This accepts any sequence-like object (including other arrays) and produces a new NumPy array containing the passed data. For example, a list is a good candidate for conversion:,Whenever you see “array”, “NumPy array”, or “ndarray” in the text, with few exceptions they all refer to the same thing: the ndarray object.,NumPy array indexing is a rich topic, as there are many ways you may want to select a subset of your data or individual elements. One-dimensional arrays are simple; on the surface they act similarly to Python lists:,As a simple example, suppose we wished to evaluate the function sqrt(x^2 + y^2) across a regular grid of values. The np.meshgrid function takes two 1D arrays and produces two 2D matrices corresponding to all pairs of (x, y) in the two arrays:

In[13]: data1 = [6, 7.5, 8, 0, 1]

In[14]: arr1 = np.array(data1)

In[15]: arr1
Out[15]: array([6., 7.5, 8., 0., 1.])
In[27]: arr1 = np.array([1, 2, 3], dtype = np.float64)

In[28]: arr2 = np.array([1, 2, 3], dtype = np.int32)

In[29]: arr1.dtype In[30]: arr2.dtype
Out[29]: dtype('float64') Out[30]: dtype('int32')
In[45]: arr = np.array([
   [1., 2., 3.],
   [4., 5., 6.]
])

In[46]: arr
Out[46]:
   array([
      [1., 2., 3.],
      [4., 5., 6.]
   ])

In[47]: arr * arr In[48]: arr - arr
Out[47]: Out[48]:
   array([
      [1., 4., 9.], array([
         [0., 0., 0.],
         [16., 25., 36.]
      ])[0., 0., 0.]
   ])
In[51]: arr = np.arange(10)

In[52]: arr
Out[52]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In[53]: arr[5]
Out[53]: 5

In[54]: arr[5: 8]
Out[54]: array([5, 6, 7])

In[55]: arr[5: 8] = 12

In[56]: arr
Out[56]: array([0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
In[75]: arr[1: 6]
Out[75]: array([1, 2, 3, 4, 64])
In[83]: names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])

In[84]: data = np.random.randn(7, 4)

In[85]: names
Out[85]:
   array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'],
      dtype = '|S4')

In[86]: data
Out[86]:
   array([
      [-0.048, 0.5433, -0.2349, 1.2792],
      [-0.268, 0.5465, 0.0939, -2.0445],
      [-0.047, -2.026, 0.7719, 0.3103],
      [2.1452, 0.8799, -0.0523, 0.0672],
      [-1.0023, -0.1698, 1.1503, 1.7289],
      [0.1913, 0.4544, 0.4519, 0.5535],
      [0.5994, 0.8174, -0.9297, -1.2564]
   ])

Suggestion : 7

NumPy is used to work with arrays. The array object in NumPy is called ndarray.,We can create a NumPy ndarray object by using the array() function.,To create an ndarray, we can pass a list, tuple or any array-like object into the array() method, and it will be converted into an ndarray:,type(): This built-in Python function tells us the type of the object passed to it. Like in above code it shows that arr is numpy.ndarray type.

arr = np.([1, 2, 3, 4, 5])