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.
4 Réponses :
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]
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/...
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
Merci Aritesh. C'est exactement ce que je voulais.
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)
HI Jdehesa. Merci de votre aide. Je pourrais utiliser comme solution alternative
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]