2017-03-22 2 views
0

Gegeben zwei numpy Arrays mit der gleichen Länge, ich muss von beiden die gleichen Index-Elemente, die Null sind entfernen. Beispielsweise angesichts der ArraysEntfernen Sie Null Elemente mit dem gleichen Index von zwei Arrays

a = [5 9 2 0 1 4 9 0 8 1] 
b = [1 0 3 1 2 4 2 0 3 2] 

I bräuchten

a = [5 9 2 0 1 4 9 8 1] 
b = [1 0 3 1 2 4 2 3 2] 

d.h. zu erhalten, nur das Element, das einen Null-Wert in beiden Arrays hattevon beiden Arrays entfernt wurde. Ich habe diesen Ansatz versucht

import numpy as np 

a = np.random.randint(0, 10, 10) 
b = np.random.randint(0, 10, 10) 

a_z_idx = [a != 0] 
b_z_idx = [b != 0] 

ab_z_idx = a_z_idx and b_z_idx 

a = a[ab_z_idx] 
b = b[ab_z_idx] 

aber entfernt auch die Elemente, die Null in jedem Array sind, anstatt nur Elemente zu entfernen, die Null in der sie beide sind.

Meine tatsächlichen Arrays haben mehrere Millionen Elemente, also bin ich auf der Suche nach der effizientesten Methode.

Antwort

4

Erstellen einer kombinierten Maske und Index -

mask = ~((a == 0) & (b==0)) 
a,b = a[mask], b[mask] 

Alternative Weg, um die Maske zu erzeugen -

mask = (a!=0) | (b!=0) 

Wenn Sie Lust built-ins, übersetzen diejenigen würde -

~np.logical_and(a==0, b==0) 
np.logical_or(a!=0, b!=0) 

Laufzeittest vergleicht die Maskenerstellungscodes -

In [342]: a = np.random.randint(0,10,(100000)) 

In [343]: b = np.random.randint(0,10,(100000)) 

In [344]: %timeit ~((a == 0) & (b==0)) 
    ...: %timeit (a!=0) | (b!=0) 
    ...: %timeit ~np.logical_and(a==0, b==0) 
    ...: %timeit np.logical_or(a!=0, b!=0) 
    ...: 
10000 loops, best of 3: 67.7 µs per loop 
10000 loops, best of 3: 62.8 µs per loop 
10000 loops, best of 3: 68.4 µs per loop 
10000 loops, best of 3: 62.8 µs per loop 

Kein klarer Gewinner zu sehen. Wenn Sie wählerisch sein wollen, erhalten Sie eine dieser OR-ing basierten.

+0

Große Antwort Divakar! Weißt du, ob eine dieser Methoden merklich schneller ist als die andere? – Gabriel

Verwandte Themen