Найти пересекающиеся значения в нескольких массивах NumPy - PullRequest
0 голосов
/ 24 октября 2018

У меня есть 100 больших массивов> 250 000 элементов каждый.Я хочу найти общие значения, которые находятся в этих массивах.Я знаю, что не будет значений, которые будут найдены во всех 100 массивах, но небольшое количество значений будет найдено в нескольких массивах (я подозреваю, 10-30%).Я хочу найти, какие значения находятся с наибольшей частотой среди этих массивов.(Боковая точка: массивы не имеют дубликатов)

Я знаю, что могу пройтись по массивам и в конечном итоге найти их, но это займет некоторое время.Я также знаю о функции np.intersect1d, но я даю только те значения, которые находятся во всех массивах, в то время как я ищу значения, которые будут только в примерно 20 из 100 массивов.

Моя лучшая ставка - использовать функцию np.intersect1d и проходить по всем возможным комбинациям массивов, что определенно займет некоторое время, но не так долго, как простой цикл по всем значениям 250000 x 100.Пример:

array_1 = array([1.98,2.33,3.44,,...11.1)
array_2 = array([1.26,1.49,4.14,,...9.0)
array_2 = array([1.58,2.33,3.44,,...19.1)
array_3 = array([4.18,2.03,3.74,,...12.1)
.
.
. 
array_100= array([1.11,2.13,1.74,,...1.1)

Нет значений во всех 100. Существует ли значение, которое можно найти в 30 различных массивах?

1 Ответ

0 голосов
/ 24 октября 2018

Вы можете использовать np.unique с ключевым словом return_counts или ванильный Python Counter.

Первый вариант работает, если вы можетеобъедините ваши массивы в один монолит 250k x 100 или даже расположите их за другим:

unq, counts = np.unique(monolith, return_counts=True)
ind = np.argsort(counts)[::-1]
unq = unq[ind]
counts = counts[ind]

В результате у вас останется массив, содержащий все уникальные значения и частоту, с которой они встречаются..

Если массивы должны оставаться отдельными, используйте collections.Counter для выполнения той же задачи.Далее я предполагаю, что у вас есть список, содержащий ваши массивы.Было бы очень бессмысленно иметь сто индивидуально именованных переменных:

c = Counter () для arr в массивах: c.update (arr)

Now c.most_common даст вам наиболее распространенные элементы и их количество.

...