Еще для индексации массива - PullRequest
1 голос
/ 08 января 2012

Я ищу точное представление для создания маски для индексации массива. У меня есть 2 вектора, один представляет интересующие меня данные, а другой содержит сами данные. Я попытался заставить это работать следующим образом:

dataINeed = np.arange(3)

-array([0,1,2])

data = random.randint(10,size = (10)) 

-array([5,7,9,1,5,3,7,1,2,0])

mask = data in dataINeed

- array([False,False,False,True,False,False,False,True,True,True])

Я знаю, что это может быть достигнуто с помощью операций над множествами, но я не мог понять рецепт, чтобы получить такой результат. Любая помощь в этом?

Ответы [ 2 ]

3 голосов
/ 08 января 2012

Может ли что-то подобное быть хорошим?

>>> import numpy as np
>>> dataINeed = np.arange(3)
>>> dataINeed
array([0, 1, 2])
>>> data = np.array([5,7,9,1,5,3,7,1,2,0])
>>> dataINeedset = set(dataINeed)
>>> np.array([x in dataINeedset for x in data])
array([False, False, False,  True, False, False, False,  True,  True,  True], dtype=bool)
2 голосов
/ 08 января 2012

Решение Романа Суси очень быстро (по сравнению с идеями, которые я придумал).

Вот несколько сравнений с этими другими методами:

С этой настройкой:

import numpy as np

N = 10000
m = 3000
dataINeed = np.arange(m)
data = np.random.randint(N,size = (N))

In [76]: %timeit dataINeedset = set(dataINeed); np.fromiter((x in dataINeedset for x in data),dtype = bool, count = -1)
100 loops, best of 3: 4.46 ms per loop

In [61]: %timeit ~np.prod(np.subtract.outer(data,dataINeed).astype('bool'),axis=-1,dtype='bool')
1 loops, best of 3: 335 ms per loop (Roman's solution is 75x faster than mine!)

In [54]: %timeit np.logical_or.reduce([(data == x) for x in dataINeed])
1 loops, best of 3: 1.72 s per loop  (Roman's solution is 386x faster)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...