3 votes

Filtre par index et aplati en numpy, comme tf.sequence_mask

Je voudrais filtrer mon tableau 2D avec un index et ensuite aplatir ce tableau seulement avec les valeurs dans le filtre. C'est à peu près ce que ferait tf.sequence_mask mais j'en aurais besoin dans numpy ou une autre bibliothèque légère.

Gracias.

PD : C'est un exemple :

array_2d = [[0,1,2,3,4,5],[8,9,10,11,12,0],[21,22,21,0,0,0]] # this is a numpy array
array_len = [6,5,3]
expected_output = [0,1,2,3,4,5,8,9,10,11,12,21,22,21]

2voto

yatu Points 39897

Voici une vectorized en utilisant un masque booléen pour l'indexation. array_2d :

array_2d = np.array([[0,1,2,3,4,5],[8,9,10,11,12,0],[21,22,21,0,0,0]]) 
array_len = [6,5,3]

m = ~(np.ones(array_2d.shape).cumsum(axis=1).T > array_len).T
array_2d[m]
array([ 0,  1,  2,  3,  4,  5,  8,  9, 10, 11, 12, 21, 22, 21])

Detalles

Le masque est créé à l'aide de la fonction cumsum sur un ndarray de ones de la même forme que array_2d et en effectuant une comparaison par rangée pour voir quels éléments sont supérieurs à array_len .

La première étape consiste donc à créer le fichier suivant ndarray :

np.ones(array_2d.shape).cumsum(axis=1)

array([[1., 2., 3., 4., 5., 6.],
       [1., 2., 3., 4., 5., 6.],
       [1., 2., 3., 4., 5., 6.]])

Et effectuer une comparaison par ligne avec array_len :

~(np.ones(array_2d.shape).cumsum(axis=1).T > array_len).T

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

Il suffit alors de filtrer le tableau avec :

array_2d[m]
array([ 0,  1,  2,  3,  4,  5,  8,  9, 10, 11, 12, 21, 22, 21])

1voto

Bazingaa Points 7919

C'est une façon d'utiliser un masquage booléen et de l'appliquer à votre fichier array_2d

array_2d = np.array([[0,1,2,3,4,5],[8,9,10,11,12,0],[21,22,21,0,0,0]]) 
array_len = [6,5,3]

# Create a boolean mask
mask = np.zeros((array_2d.shape), dtype=bool)

# Change to True for elements to be kept
for i, j in enumerate(array_len):
        mask[i][0:j] = True

expected_output = array_2d.flatten()[mask.flatten()]

Sortie

array([ 0,  1,  2,  3,  4,  5,  8,  9, 10, 11, 12, 21, 22, 21])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X