2
votes

Comment sélectionner des colonnes non nulles dans une matrice en python

Supposons que j'ai des données au format suivant:

C0 C1 C2 C3 C4 C5 C6 C7 C8
0  0  0  0  0  0  0  0  0
0  0  0  0  0  0  0  0  0
0  0  2  3  4  5  6  0  0
0  1  4  5  6  7  8  0  0
0  0  0  0  0  0  0  0  0

Je veux sélectionner des colonnes non nulles, telles que la colonne C1, C2, C3, C4, C5, C6 code> en python. Toute commande pouvant me donner directement le format souhaité.


4 commentaires

De quel type de structure de données s'agit-il?


Matrice avec colonnes C1, C2, C3, C4, C5, C6


@RayyanKhan Quel genre de matrice? Pandas DF, tableau NumPy, liste de listes Python ... etc.


@ Tomothy32, j'ai un tableau NumPy au format n * n


4 Réponses :


1
votes

Si vous utilisez une bibliothèque comme les pandas, alors c'est beaucoup plus simple

Vous prenez juste la moyenne de chaque colonne et si elles sont supérieures à 0, ce sont vos colonnes obligatoires

Pour cela, je vais donner vous un morceau de code:

import pandas as pd

df = pd.read_csv("File Path")
a = df.mean(axis=0) #gives you column wise mean
for i in len(a):
   if a[i] > 0:
      print(i)  # i will be your column


5 commentaires

comme les tableaux sont de plus grande taille, je ne pense pas qu'avec une boucle, ce serait une bonne idée d'obtenir le résultat souhaité car cela demanderait un temps de calcul important.


Ce tableau est de taille no_of_columns


@RayyanKhan .any () semble la seule autre méthode, mais cela aussi utilise des boucles


Oui mais pour vous faire comprendre j'ai utilisé cette méthode


Si cela vous a aidé, veuillez en faire une réponse vérifiée



0
votes

Supposons que votre matrice est implémentée comme une liste de listes, où le premier index est la colonne, le deuxième index est la ligne:

nonzero_columns = [column for column in matrix if any(column)]
# any() will return true here if any element of column is nonzero

Ensuite, vous pouvez utiliser une compréhension de liste pour obtenir une liste des seules colonnes de matrix qui ne sont pas toutes des zéros

matrix[3][2] == 3


0 commentaires

5
votes

Vous pouvez utiliser n'importe quel avec l'indexation numpy pour sélectionner des colonnes avec des valeurs différentes de zéro.

Configuration strong>

array([[0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 2, 3, 4, 5, 6],
       [1, 4, 5, 6, 7, 8],
       [0, 0, 0, 0, 0, 0]], dtype=int64)

a[:, a.any(0)]

a = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 2, 3, 4, 5, 6, 0, 0],
              [0, 1, 4, 5, 6, 7, 8, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=int64)


2 commentaires

Merci pour votre gentille réponse. De plus, si je veux exclure des lignes de la même manière, comme si je veux les lignes 2 et 3, quelle commande dois-je utiliser?


Les lignes seraient a [a.any (1)]



1
votes

Avec numpy :

columns = ['C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8']
s = pd.DataFrame(data=a, columns=columns).any()

s = s[s == 1]

>>> s
C1    True
C2    True
C3    True
C4    True
C5    True
C6    True
dtype: bool

Si vous en avez besoin comme noms de colonne ( C1 , C2 , C3 , C4 , C5 , C6 ), utilisez pandas : p >

import numpy as np 

a = np.array([[0,0,0,0,0,0,0,0,0],
              [0,0,0,0,0,0,0,0,0],
              [0,0,2,3,4,5,6,0,0],
              [0,1,4,5,6,7,8,0,0],
              [0,1,4,5,6,7,8,0,0]])

r = np.nonzero(np.any(a != 0, axis=0))[0]

>>> r
[1 2 3 4 5 6]


0 commentaires