5 votes

Tester si un sous-tableau du tableau donné

Il s'agit d'une question assez basique d'un utilisateur débutant de Numpy : J'ai un tableau 2D de disons 5 lignes et 2 colonnes, que l'on peut voir comme 10 vecteurs 2D, et je veux tester si un vecteur donné est à l'intérieur du tableau.

Par exemple :

>>> tableau = array(range(10), dtype = uint8)
>>> tableau.shape = (5,2)
>>> print tableau
[[ 0  1]
 [ 2  3]
 [ 4  5]
 [ 6  7]
 [ 8  9]]
>>> [0, 1] in tableau
True

La dernière ligne donne True, mais '[0, 2] in tableau' aussi.

Pour le moment, je calcule la distance euclidienne pour voir si elle est égale à 0, mais je suis sûr qu'il y a une réponse plus simple.

Merci pour toute aide

5voto

ecatmur Points 64173

Vous pouvez effectuer une réduction booléenne sur le tableau de correspondance :

([0, 1] == tableau).all(axis=1).any()

1voto

MeisenBar Points 54

Direct, vous pourriez utiliser any() pour parcourir un générateur en comparant les tableaux avec array_equal.

from numpy import array_equal

in_t = lambda x, t : any((array_equal(a,x) for a in t))

print in_t([0, 2], tableau)
print in_t([0, 1], tableau)

0voto

David Points 188

J'ai écrit une fonction pour résoudre cela qui gère également les cas multidimensionnels. (La réponse de @ecatmur fonctionne parfaitement en deux dimensions, mais échoue pour 1D ou 3D+)

import numpy as np
def haselement(arr,subarr):
    '''Testez si subarr est égal à l'un des éléments de arr.
       C'est l'équivalent de l'opérateur "in" lors de l'utilisation de listes au lieu de tableaux.'''
    arr = np.asarray(arr)
    subarr = np.asarray(subarr)
    if subarr.shape!=arr.shape[1:]:
        return False
    elif arr.ndim<2:
        return (subarr==arr).any()
    else:
        boolArr = (subarr==arr)
        boolArr.resize([arr.shape[0],np.prod(arr.shape[1:])])
        return boolArr.all(axis=1).any()

tableau = np.array(range(10), dtype = np.uint8)
tableau.shape = (5,2)
haselement(tableau,[0,1])

La 1D est gérée avec une instruction if, et la ND est gérée en redimensionnant le tableau en 2D afin que l'algorithme de @ecatmur fonctionne. Les autres façons auxquelles j'ai pensé pour résoudre cela impliquaient des compréhensions de liste ou des boucles (qui pourraient en fait être plus efficaces mais seulement si la liste est longue et que l'élément est près du début) ; quand même, cela semble plus numpy-thonic.

Vous pouvez également trouver la fonction ici si vous préférez l'utiliser à partir d'une bibliothèque :

https://github.com/davidmashburn/np_utils (déni évident, je suis l'auteur ;) )

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