Ответ 1
import numpy as np
A = np.array([1,2,3,4,5,6,7])
B = np.array([2,4,6])
C = np.searchsorted(A, B)
D = np.delete(np.arange(np.alen(A)), C)
D
#array([0, 2, 4, 6])
Эта проблема кажется легкой, но я не могу получить красивое решение. У меня есть два массива numpy (A и B), и я хочу получить индексы A, где элементы A находятся в B, а также получить индексы A, где элементы не находятся в B.
Итак, если
A = np.array([1,2,3,4,5,6,7])
B = np.array([2,4,6])
В настоящее время я использую
C = np.searchsorted(A,B)
который использует тот факт, что A
по порядку, и дает мне [1, 3, 5]
, индексы элементов, которые находятся в A
. Это здорово, но как мне получить D = [0,2,4,6]
, индексы элементов A
, которые не находятся в B
?
import numpy as np
A = np.array([1,2,3,4,5,6,7])
B = np.array([2,4,6])
C = np.searchsorted(A, B)
D = np.delete(np.arange(np.alen(A)), C)
D
#array([0, 2, 4, 6])
searchsorted
может дать вам неправильный ответ, если не каждый элемент B находится в A. Вы можете использовать numpy.in1d
:
A = np.array([1,2,3,4,5,6,7])
B = np.array([2,4,6,8])
mask = np.in1d(A, B)
print np.where(mask)[0]
print np.where(~mask)[0]
:
[1 3 5]
[0 2 4 6]
Однако in1d()
использует сортировку, которая медленна для больших наборов данных. Вы можете использовать pandas, если ваш набор данных большой:
import pandas as pd
np.where(pd.Index(pd.unique(B)).get_indexer(A) >= 0)[0]
Вот сравнение времени:
A = np.random.randint(0, 1000, 10000)
B = np.random.randint(0, 1000, 10000)
%timeit np.where(np.in1d(A, B))[0]
%timeit np.where(pd.Index(pd.unique(B)).get_indexer(A) >= 0)[0]
выход:
100 loops, best of 3: 2.09 ms per loop
1000 loops, best of 3: 594 µs per loop
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7])
b = np.array([2, 4, 6])
c = np.searchsorted(a, b)
d = np.searchsorted(a, np.setdiff1d(a, b))
d
#array([0, 2, 4, 6])
set (A) и set (B)
set (A) - set (B)