0
votes

Comment filtrer des tableaux numpus avec des conditions sur les propriétés de l'élément, pas seulement des valeurs?

Si je veux filtrer une matrice numpue basée sur des conditions de valeur, je peux faire:

arr = np.array([1], [2, 2], [3, 3, 3], [4, 4, 4, 4])
filtered = arr[len(arr) > 2]
# this does not output the desired [[3, 3, 3], [4, 4, 4, 4]], but rather [arr]


0 commentaires

3 Réponses :


0
votes

Vous pouvez vous vectoriser la fonction len code> et l'utiliser sur n'importe quel tableau souhaité:

In [29]: vv = np.vectorize(lambda x: len(x)>2)                                                                                                                                                              

In [30]: arr[vv(arr)]                                                                                                                                                                                       
Out[30]: array([list([3, 3, 3]), list([4, 4, 4, 4])], dtype=object)

In [31]: %timeit arr[vv(arr)]                                                                                                                                                                               
31.6 µs ± 385 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [32]: vv = np.vectorize(len)                                                                                                                                                                             

In [33]: %timeit arr[vv(arr)>2]                                                                                                                                                                             
35 µs ± 578 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)


0 commentaires

0
votes

Vous allez ici:

In [7]: import numpy as np                                                                                                                                                      

In [8]: arr = np.array([[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]])                                                                                                                  

In [9]: check = np.vectorize(lambda element : len(element) > 2)                                                                                                                 

In [10]: arr[check(arr)]                                                                                                                                                        
Out[10]: array([list([3, 3, 3]), list([4, 4, 4, 4])], dtype=object)


0 commentaires

0
votes

Votre exemple produit une erreur: xxx pré>

Avez-vous l'intention de produire un graphique d'objet DTYPE: p> xxx pré>

(Cet avertissement futur est Produits par 1.19Dev.) P>

Pour la plupart des fins, un tableau DTYPE Object ressemble plus à une liste qu'un tableau numérique. Ainsi, nous pourrions utiliser une compréhension de la liste pour trouver les listes plus longues: p> xxx pré>

=== p>

autres ont suggéré np.vectoriser code >. C'est plus lent. P>

In [148]: %%timeit alist=arr.tolist() 
     ...: [a for a in alist if len(a)>2]                                                                                                        
626 ns ± 2.41 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)


0 commentaires