2017-02-01 15 views
1

Это то, что я в настоящее время:Как маскировать элементы массивов, отсутствующие во втором массиве в Python?

x = range(10) 
x2 = array(x) 
y = [3,6,8] 

for i in range(len(x)): 
    x2[i] = x2[i] in y 

x = ma.masked_where(x2 == False, x) 

Это заставляет меня, что я хочу, но я хочу сделать это без зацикливания. Любой способ маскировать массив x, где значения отсутствуют в y?

ответ

0

Этот подход, использующий понимание списков, не зависит от каких-либо конструкций numpy. Он держит номер, если он находится в y, и ставит -, если это не

x = [i if i in y else '-' for i in range(10)] 

выход

['-', '-', '-', 3, '-', '-', 6, '-', 8, '-'] 

Изменение «-», если вы хотите изменить значение по умолчанию для маски.

+0

Это похоже на то, что я хочу, но мне нужно уметь маскировать этот массив и применять эту маску к другому массиву, а затем, в конце концов, сжать их обоих. Знать любой способ замаскировать это? Я пробовал masked_where и попытался использовать этот тип в качестве флага, и я попробовал masked_value, чтобы указать '-', но ни один из них не работает. –

+1

Подожди, я понял! Я просто изменил '-' на float ('nan') и использовал masked_invalid. Благодаря! –

0

Вы можете использовать set.intersection, чтобы получить номера соответствия, то он вернет вам значение, которые соответствуют, и это делается без зацикливания:

x = range(10) 
y = [3,6,8] 
s1 = set(x) 
s2 = set(y) 
s1.intersection(s2) 

(Output:) set([8, 3, 6]) 

x = [1,2,3,4,5] 
y = [2,3,6,7,8] 
s1 = set(x) 
s2 = set(y) 
s1.intersection(s2) 

(Output:) set([2, 3]) 

Вы можете получить список литья набора:

y = list(s1.intersection(s2)) 
+0

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

0

Вы можете использовать numpy, чтобы сделать петли для вас, тем самым ускоряя вычисления.

x = np.arange(10) 
y = np.array([3,6,8]) 

mask = np.all(x!=y[:,None], 0) 
x = np.ma.masked_where(mask,x) 
+0

Это, безусловно, хорошая резервная копия. В идеале я бы вообще не зацикливался, но это, скорее всего, мне нужно будет сделать. Благодаря! –