J'ai un dictionnaire structuré comme ci-dessous.

test_dict = {1: 'I run fast', 2: 'She runs', 3: 'How are you?'}

Ce que j'essaie de faire est de convertir toutes les chaînes en tableaux numpy 4x4 où chaque mot est dans sa propre ligne et chaque lettre occupe une cellule du tableau, remplie de blancs pour les lignes qui ne rempliraient pas toute la ligne d'une ligne entière de blancs pour les phrases de moins de 4 mots. Je dois également être en mesure de le rattacher à l'ID, le résultat doit donc être dans un format permettant de référencer chaque tableau par son ID plus tard.

Je ne connais aucune fonction prédéfinie qui puisse gérer quelque chose comme ça, mais je serais heureux de me tromper. Pour l'instant, j'ai essayé d'écrire une boucle pour le gérer. Ci-dessous est évidemment incomplet car je suis bloqué au moment de créer un tableau dans la structure que je voudrais.

for k in test_dict.keys():
    sentence = test_dict.getvalues(k)
    sentence_ascii = [ord(c) for c in sentence]
    sentence_array = np.array(sentence_ascii)
0
user2355903 28 mai 2020 à 23:17

3 réponses

Meilleure réponse

Cela garantira que vous avez des lignes vides pour les phrases de moins de quatre mots.

new_dict = {i+1:np.empty((4,4),dtype='str') for i in range(len(test_dict))}
for k,v in test_dict.items():
    new_dict[k][:len(v.split())] = np.array([list(s)+['']*(4-len(s)) for s in v.split()])
    new_dict[k] = new_dict[k].view(np.int32)
0
Mercury 28 mai 2020 à 21:46

C'est ce que tu veux dire?

{
    key: np.array([list(word.ljust(4)) for word in val.split()])
    for key, val in test_dict.items()
}

Production:

{1: array([['I', ' ', ' ', ' '],
           ['r', 'u', 'n', ' '],
           ['f', 'a', 's', 't']], dtype='<U1'),
 2: array([['S', 'h', 'e', ' '],
           ['r', 'u', 'n', 's']], dtype='<U1'),
 3: array([['H', 'o', 'w', ' '],
           ['a', 'r', 'e', ' '],
           ['y', 'o', 'u', '?']], dtype='<U1')}
1
Brian Joseph 28 mai 2020 à 21:51

Vous pouvez l'utiliser pour appeler vos tableaux en utilisant le champ 'ID':

dt=[('ID', '<i4'), ('sentences', object)]
new_dict = np.empty(len(test_dict), dtype=dt)
for i, (k, v) in enumerate(test_dict.items()):
  new_dict[i] = (k, np.pad(np.array([list("{:<4}".format(w)) for w in v.split(' ')]).view(np.int32), [(0,4-len(v.split(' '))),(0,0)]))

Exemple de sortie:

print(new_dict[new_dict['ID']==2]['sentences'])

[array([[ 83, 104, 101,  32],
   [114, 117, 110, 115],
   [  0,   0,   0,   0],
   [  0,   0,   0,   0]], dtype=int32)]
0
Ehsan 28 mai 2020 à 22:07