1
votes

Supprimer les lignes d'un tableau numpy en fonction d'une condition spécifique

J'ai un tableau de quatre lignes A = array ([[- 1, -1, -1, -1], [-1, -1, 1, 2], [-1, -1 , 1, 1], [2, 1, -1, 2]]) . Dans chaque ligne, il y a des nombres 4 . Comment supprimer la ligne # 3 et la ligne # 4 ? Dans la ligne # 3 et la ligne # 4 , 1 et 2 apparaissent plus d'une fois respectivement.

Existe-t-il un moyen plus rapide de le faire pour un nombre arbitraire de lignes et de colonnes? L'objectif principal est de supprimer les lignes où un nombre non négatif apparaît plus d'une fois.


0 commentaires

3 Réponses :


2
votes

Vous pouvez utiliser quelque chose comme ceci: créez d'abord un dictionnaire des occurrences de chaque valeur dans les sous-tableaux en utilisant np.unique et ne gardez que les tableaux où aucun nombre positif n'apparaît plus d'une fois.

array([[-1, -1, -1, -1],
       [-1, -1,  1,  2]])

ceci renvoie:

A = np.array([[-1, -1, -1, -1], [-1, -1, 1, 2], [-1, -1, 1, 1], [2, 1, -1, 2]])

new_array = []

# loop through each array
for array in A:
    # Get a dictionary of the counts of each value
    unique, counts = np.unique(array, return_counts=True)
    counts = dict(zip(unique, counts))
    # Find the number of occurences of postive numbers
    positive_occurences = [value for key, value in counts.items() if key > 0]
    # Append to new_array if no positive number appears more than once
    if any(y > 1 for y in positive_occurences):
        continue
    else:
        new_array.append(array)

new_array = np.array(new_array)


2 commentaires

existe-t-il un moyen de connaître les indices des lignes qui ne sont pas considérés?


j'ai un peu modifié. S'il vous plaît voir ma réponse et dites-moi ce que j'ai fait est ok.



2
votes

Mon approche entièrement vectorisée:

  • trier chaque ligne
  • détecter les doublons en décalant le tableau trié de un vers la gauche et en le comparant avec lui-même
  • marquer les lignes avec des doublons positifs
  • déposer
import numpy as np
a = np.array([[-1, -1, -1, -1], [-1, -1, 1, 2], [-1, -1, 1, 1], [2, 1, -1, 2]])

# sort each row
b = np.sort(a)

# mark positive duplicates
drop = np.any((b[:,1:]>0) & (b[:,1:] == b[:,:-1]), axis=1)

# drop
aa = a[~drop, :]

Output:
array([[-1, -1, -1, -1],
       [-1, -1,  1,  2]])


0 commentaires

0
votes

J'ai également modifié pour stocker les indices:

A = np.array([[-1, -1, -1, -1], [-1, -1, 1, 2], [-1, -1, 1, 1], [2, 1, -1, 2]])

new_array = []
**indiceStore = np.array([])**

# loop through each array
for array in A:
    # Get a dictionary of the counts of each value
    unique, counts = np.unique(array, return_counts=True)
    counts = dict(zip(unique, counts))
    # Find the number of occurences of postive numbers
    positive_occurences = [value for key, value in counts.items() if key > 0]
    # Append to new_array if no positive number appears more than once
    if any(y > 1 for y in positive_occurences):
        **indiceStore = np.append(indiceStore, int(array))**
        continue
    else:
        new_array.append(array)

new_array = np.array(new_array)

Faites-moi savoir si c'est vrai.


0 commentaires