2
votes

conversion de la matrice np et de ses indices en deux listes

J'ai la matrice suivante.

list1 = [0,0.5,0.3,0.4,0.5,0.6,0,2,3,4,5,6,0,2.2,3.5,4.4,5.5,6.5]
list2 = ['0-0','0-1','0-2','0-3','0-4','0-5',
         '1-0','1-1','1-2','1-3','1-4','1-5',
         '2-0','2-1','2-2','2-3','2-4','2-5']

Je veux créer deux listes qui contiennent chaque élément de la matrice et son index correspondant sous forme de chaînes. ma sortie attendue est la suivante:

data = np.matrix([[0,0.5,0.3,0.4,0.5,0.6], [0,2,3,4,5,6],[0,2.2,3.5,4.4,5.5,6.5]])

Quelqu'un peut-il donner des conseils à ce sujet? si possible, je souhaite créer une fonction pour le processus mentionné ci-dessus.

Merci,

zep.


0 commentaires

4 Réponses :


1
votes

Pour un tableau numpy , vous pouvez procéder comme suit:

from scipy.sparse import  csr_matrix
list1 = sm.toarray().ravel().tolist()
list2 = list(zip(*sm.nonzero()))
# [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 1), (1, 2), (1, 3), (1, 4), 
# (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5)]

Vous pouvez utiliser un générateur pour parcourir les différentes longueurs des sous-listes: p >

list2 = [f'{x}-{y}' for x in range(len(data)) for y in next(g)]
#['0-0', '0-1', '0-2', '0-3', '0-4', '0-5', '1-0', '1-1', '1-2',
# '1-3', '1-4', '1-5', '2-0', '2-1', '2-2', '2-3', '2-4', '2-5']

Construisez la liste des coordonnées avec une compréhension de liste et utilisez le formatage de chaîne pour obtenir le résultat souhaité:

g = (range(len(i)) for i in data)

Une autre alternative consiste à utiliser scipy.sparse.csr_matrix :

data = np.array([[0,0.5,0.3,0.4,0.5,0.6], [0,2,3,4,5,6],[0,2.2,3.5,4.4,5.5,6.5]])
list1 = data.ravel().tolist()
# [0.0, 0.5, 0.3, 0.4, 0.5, 0.6, 0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 0.0, 2.2, 3.5, 4.4, 5.5, 6.5]


10 commentaires

Merci Yatu pour les conseils. Comment puis-je supprimer les parenthèses et la virgule et les remplacer par - dans la liste 2.


Oui c'est vrai! Mise à jour de la réponse


@Zephyr essaie maintenant, il y avait un problème. Dites moi si ca marche


Merci Yatu. Lorsque j'imprime la liste 2, je n'ai que trois éléments.


Oui mais j'ai mis à jour la solution @Zephyr, veuillez vérifier à nouveau. Ajout d'une méthode plus simple et beaucoup plus efficace en utilisant scipy.sparse.csr_matrix


Merci beaucoup pour vos conseils en utilisant scipy. Je pourrais utiliser ceci comme solution alternative


Comment abt si j'utilisais cela, la boucle for.i.e chaque boucle générera une matrice 5by5 et j'aime l'ajouter et plus tard pour créer un dataframe. Je l'ai fait en ajoutant à un dataframe mais chaque ligne que j'ai obtenue est une liste de chaque génération.


Désolé, je ne sais pas trop ce que vous voulez dire. Vous pourriez envisager de poser une autre question à ce sujet et je serai heureux de vous aider :-)


Merci je le posterai bientôt


je viens de le poster. stackoverflow.com/questions/54576302/...



1
votes

Vous pouvez parcourir des éléments -

createlist(data)

Appelez cette fonction avec votre matrice-

def createlist(data):
    ls1=[]
    ls2=[]
    for i in range(data.shape[0]):
        for j in range(data.shape[1]):
            ls1.append(data[i, j])
            ls2.append(str(i)+ "-" + str(j))
    return ls1, ls2


1 commentaires

Merci Aritesh. C'est exactement ce que je voulais.



1
votes

Voici un moyen de faire cela avec NumPy:

[0.0, 0.5, 0.3, 0.4, 0.5, 0.6, 0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 0.0, 2.2, 3.5, 4.4, 5.5, 6.5]
['0-0', '0-1', '0-2', '0-3', '0-4', '0-5', '1-0', '1-1', '1-2', '1-3', '1-4', '1-5', '2-0', '2-1', '2-2', '2-3', '2-4', '2-5']

Sortie:

import numpy as np

data = np.matrix([[  0, 0.5, 0.3, 0.4, 0.5, 0.6],
                  [  0,   2,   3,   4,   5,   6],
                  [  0, 2.2, 3.5, 4.4, 5.5, 6.5]])
ind = np.indices(data.shape).astype(str)
list1 = data.ravel().tolist()[0]
list2 = np.char.add(np.char.add(ind[0], '-'), ind[1]).ravel().tolist()
print(list1)
print(list2)


1 commentaires

HI Jdehesa. Merci de votre aide. Je pourrais utiliser comme solution alternative



0
votes

Vous pouvez utiliser la réponse ci-dessus avec cette modification mineure -

list2 = ['{}-{}'.format(x,y) for x in range(len(data)) for y in [len(i) for i in data]


0 commentaires