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.
3 Réponses :
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)
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.
Mon approche entièrement vectorisée:
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]])
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.