Hello et bonnes fêtes de fin d'année à tous!
J'ai deux objets (que je vais appeler A et B), chacun composés de plusieurs structures de données dont principalement des arrays numpy (les deux qui m'intéressent dans un premier temps sont des arrays 2D que je vais appeler T et d).
A.T.shape[0] == A.d.shape[0], B.T.shape[0] == B.d.shape[0] mais A.T.shape[0] != B.T.shape[0].
A.T.shape[1] != A.d.shape[1] et B.T.shape[1] != B.d.shape{A].
A.T.shape[1] == B.T.shape[1] mais A.d.shape[1] != B.d.shape[1].
T est un index temporel qui permet d'ordonner les valeurs de tous les arrays de A et de B.
Pour compliquer les choses, les arrays T n'ont pas 1 mais deux formats de date pour chaque rangée (année décimale et jour julien, donc [A|B].T.shape[1] == 2).
Je ne peux pas toucher à ces objets, je dois travailler avec tels quels.
J'ai besoin de générer un objet qui inclut toutes les données de A et B en gardant l'index temporel. En gros, insérer B dans A de manière ordonnée, aussi bien pour T que pour d et tous les autres arrays associés.
Ma question est peut-être très bête, je ne sais pas comment faire pour réaliser cette opération, encore moins de manière efficace.
Pour l'instant je crée un array global des temps en concatenant A.T et B.T et en les ordonant (on doit pouvoir le faire en one-liner mais ce n'est pas la question encore) puis j'itère sur sa longueur pour trouver toutes les rangées de A.T et B.T qui correspondent à cet index (pour ensuite aller chercher les données dans les autres arrays de A et de B et peupler de nouveaux arrays combinant les arrays source) :
Sauf que là ça plante parce que la valeur dans la deuxième colonne de full_index et de A ne sont pas toujours (la plupart du temps mais pas systématiquement) exactement les mêmes et donc la comparaison renvoie un array vide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 full_index = np.concatenate((A.T, B.T)) full_index = full_index[full_index[:,0].argsort()] for k in range(full_index.shape[0]): if full_index[k,0] in A.T[:,0]: rangA = = np.where(np.all(full_index[k] == A.T[:], axis=1))
En regardant le contenu dans ces cas, par exemple, en colonne 1 j'ai 50129.50000000003 pour la valeur dans l'index et 50129.5 pour la valeur dans A.T. Les deux sont des float64.
Si je pouvais ne comparer que la valeur de la colonne 0 des deux arrays pour obtenir rangA je contournerais sans doute le problème (sauf que je n'arrive pas à trouver la syntaxe...) mais en plus, j'imagine que si les valeurs dans la colonne 1 ne sont pas systématiquement les mêmes parce que j'ai des modifications de la valeur (lors de la concatenation ?), je peux aussi rater des cas où la valeur de la colonne 0 devrait pointer vers une rangée soit dans A.T soit dans B.T.
Bref, c'est le bazar... J'ai l'impression de mal m'y prendre mais je ne sais pas comment faire pour corriger ça. Si vous avez des pistes, je suis preneur, merci !
Partager