Étant donné une liste python de tuples telle que:
array([[47.9, 29.7, 30.8, 45.8, 43.9],
[-112.8, -90.8, -99.1, -110.9, -69.8]])
Quelle est la manière la plus efficace de construire un tableau numpy 2D en utilisant les 3e et 4e éléments de chaque tuple?
Le résultat souhaité est:
test = [(1, 'string1', 47.9, -112.8, 6400.0),
(2, 'string2', 29.7, -90.8, 11.0),
(3, 'string3', 30.8, -99.1, 1644.0),
(4, 'string4', 45.8, -110.9, 7500.0),
(5, 'string5', 43.9, -69.8, 25.0)]
5 Réponses :
Vous pouvez transformer la liste des tuples directement en un tableau puis utiliser le découpage et la transposition pour obtenir la sortie souhaitée:
[[ 47.9 29.7 30.8 45.8 43.9] [-112.8 -90.8 -99.1 -110.9 -69.8]]
Sortie
import numpy as np
test = [(1, 'string1', 47.9, -112.8, 6400.0),
(2, 'string2', 29.7, -90.8, 11.0),
(3, 'string3', 30.8, -99.1, 1644.0),
(4, 'string4', 45.8, -110.9, 7500.0),
(5, 'string5', 43.9, -69.8, 25.0)]
arr = np.array(test, dtype=object)
result = arr[:, 2:4].T.astype(np.float32)
print(result)
Notez qu'après avoir fait arr = np.array (test) tout est fait au niveau numpy.
Oui, c'est probablement le plus efficace car cela évite la compréhension de liste (tout est fait dans numpy).
Pour cette méthode, je ferais arr = np.array (test, dtype = object) . En l'état, les valeurs flottantes sont converties en chaîne, puis reconverties en float, ce qui peut entraîner une perte de précision.
Toute l'action peut être dans np.array , mais cela ne signifie pas qu'elle est plus rapide. La lecture de la liste, la conversion en chaîne, puis en flottant prend du temps. Le chargement d'un objet dtype fait gagner du temps. Mais pour ce petit échantillon, sélectionner d'abord les colonnes avec une liste de compréhension est plus rapide.
Mon cas d'utilisation réel aura len (test) d'environ 20 000
la première liste est:
result = np.array([the_first, second])
et la seconde est:
second = [item[3] for item in test]
et le résultat est:
the_first = [item[2] for item in test]
Vous pouvez essayer ceci:
import numpy as np test = [(1, 'string1', 47.9, -112.8, 6400.0), (2, 'string2', 29.7, -90.8, 11.0), (3, 'string3', 30.8, -99.1, 1644.0), (4, 'string4', 45.8, -110.9, 7500.0), (5, 'string5', 43.9, -69.8, 25.0)] result = np.array([(item[3], item[4]) for item in test]).T print(result) # array([[-112.8, -90.8, -99.1, -110.9, -69.8], # [6400. , 11. , 1644. , 7500. , 25. ]])
Vous pouvez préparer les données en dehors de numpy en utilisant une compréhension de liste qui sélectionne le 3e et le 4e élément. Ensuite, il vous suffit de transposer le tableau résultant:
np.array([x[2:4] for x in test]).T
zip la liste, tranche en utilisant itertools.islice:
from itertools import islice np.array(list(islice(zip(*test), 2, 4))) # array([[ 47.9, 29.7, 30.8, 45.8, 43.9], # [-112.8, -90.8, -99.1, -110.9, -69.8]])