Найти индексы массива numpy на основе значений в другом массиве numpy - PullRequest
0 голосов
/ 23 сентября 2019

Я хочу найти индексы в большем массиве, если они соответствуют значениям другого, меньшего массива.Что-то вроде new_array ниже:

import numpy as np
summed_rows = np.random.randint(low=1, high=14, size=9999)
common_sums = np.array([7,10,13])
new_array = np.where(summed_rows == common_sums)

Однако, это возвращает:

__main__:1: DeprecationWarning: elementwise comparison failed; this will raise an error in the future. 
>>>new_array 
(array([], dtype=int64),)

Самое близкое, что я получил:

new_array = [np.array(np.where(summed_rows==important_sum)) for important_sum in common_sums[0]]

Это дает мнесписок с тремя массивами-пустышками (по одному для каждой «важной суммы»), но каждый из них имеет разную длину, что порождает дальнейшие проблемы в нисходящем направлении с конкатенацией и vstacking.Чтобы было ясно, я не хочу использовать строку выше.Я хочу использовать NumPy для индексации в summed_rows.Я посмотрел на различные ответы, используя numpy.where, numpy.argwhere и numpy.intersect1d, но у меня проблемы с объединением идей.Я подумал, что упускаю что-то простое, и было бы быстрее спросить.

Заранее спасибо за ваши рекомендации!

Ответы [ 2 ]

2 голосов
/ 23 сентября 2019

Принимая во внимание предложенные опции в комментариях и добавляя дополнительную опцию с опцией numpy's in1d:

>>> import numpy as np
>>> summed_rows = np.random.randint(low=1, high=14, size=9999)
>>> common_sums = np.array([7,10,13])
>>> ind_1 = (summed_rows==common_sums[:,None]).any(0).nonzero()[0]   # Option of @Brenlla
>>> ind_2 = np.where(summed_rows == common_sums[:, None])[1]   # Option of @Ravi Sharma
>>> ind_3 = np.arange(summed_rows.shape[0])[np.in1d(summed_rows, common_sums)]
>>> ind_4 = np.where(np.in1d(summed_rows, common_sums))[0]
>>> ind_5 = np.where(np.isin(summed_rows, common_sums))[0]   # Option of @jdehesa

>>> np.array_equal(np.sort(ind_1), np.sort(ind_2))
True
>>> np.array_equal(np.sort(ind_1), np.sort(ind_3))
True
>>> np.array_equal(np.sort(ind_1), np.sort(ind_4))
True
>>> np.array_equal(np.sort(ind_1), np.sort(ind_5))
True

Если вы примете время, вы увидите, что все они довольно похожи, но @Вариант Бренллы самый быстрый

python -m timeit -s 'import numpy as np; np.random.seed(0); a = np.random.randint(low=1, high=14, size=9999); b = np.array([7,10,13])' 'ind_1 = (a==b[:,None]).any(0).nonzero()[0]'
10000 loops, best of 3: 52.7 usec per loop

python -m timeit -s 'import numpy as np; np.random.seed(0); a = np.random.randint(low=1, high=14, size=9999); b = np.array([7,10,13])' 'ind_2 = np.where(a == b[:, None])[1]'
10000 loops, best of 3: 191 usec per loop

python -m timeit -s 'import numpy as np; np.random.seed(0); a = np.random.randint(low=1, high=14, size=9999); b = np.array([7,10,13])' 'ind_3 = np.arange(a.shape[0])[np.in1d(a, b)]'
10000 loops, best of 3: 103 usec per loop

python -m timeit -s 'import numpy as np; np.random.seed(0); a = np.random.randint(low=1, high=14, size=9999); b = np.array([7,10,13])' 'ind_4 = np.where(np.in1d(a, b))[0]'
10000 loops, best of 3: 63 usec per loo

python -m timeit -s 'import numpy as np; np.random.seed(0); a = np.random.randint(low=1, high=14, size=9999); b = np.array([7,10,13])' 'ind_5 = np.where(np.isin(a, b))[0]'
10000 loops, best of 3: 67.1 usec per loop
0 голосов
/ 23 сентября 2019

Использование np.isin:

import numpy as np
summed_rows = np.random.randint(low=1, high=14, size=9999)
common_sums = np.array([7, 10, 13])
new_array = np.where(np.isin(summed_rows, common_sums))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...