- Я бы использовал pandas, который находится на numpy, для создания логической маски
- Требуется 4 строки кода
import numpy as np
import pandas as pd
# create test data
np.random.seed(1)
a = np.random.randint(10, size=(10, 1))
np.random.seed(1)
b = np.random.randint(8, 15, size=(10, 1))
# create dataframe
df_a = pd.DataFrame(a)
df_b = pd.DataFrame(b)
# find unique values in df_a
unique_a = df_a[0].unique().tolist()
# create a Boolean mask and return only values of df_b not found in df_a
values_not_in_a = df_b[~df_b[0].isin(unique_a)].to_numpy()
Значения
a = array([[5],
[8],
[9],
[5],
[0],
[0],
[1],
[7],
[6],
[9]])
b = array([[13],
[11],
[12],
[ 8],
[ 9],
[11],
[13],
[ 8],
[ 8],
[ 9]])
# final output array
values_not_in_a = array([[13],
[11],
[12],
[11],
[13]])
Только с использованием numpy
import numpy
# create test data
np.random.seed(1)
a = np.random.randint(10, size=(10, 1))
np.random.seed(1)
b = np.random.randint(8, 15, size=(10, 1))
ua = np.unique(a) # unique values of a
ub = np.unique(b) # unique values of b
mask_b = np.isin(b, ua, invert=True)
mask_a = np.isin(a, ub, invert=True)
b_values_not_in_a = b[mask_b]
a_values_not_in_b = a[mask_a]
# b_values_not_in_a
array([13, 11, 12, 11, 13])
# a_values_not_in_b
array([5, 5, 0, 0, 1, 7, 6])
timeit
# using the following arrays
np.random.seed(1)
a = np.random.randint(10, size=(90000, 1))
np.random.seed(1)
b = np.random.randint(8, 15, size=(120000, 1))
%%timeit
5.6 ms ± 151 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)