Disons que vous avez 3 tableaux numpy: lat
, lon
, val
:
import numpy as np
lat=np.array([[10, 20, 30],
[20, 11, 33],
[21, 20, 10]])
lon=np.array([[100, 102, 103],
[105, 101, 102],
[100, 102, 103]])
val=np.array([[17, 2, 11],
[86, 84, 1],
[9, 5, 10]])
Et dites que vous voulez créer une image pandas
où df.columns = ['lat', 'lon', 'val']
, mais étant donné que chaque valeur de lat
est associée à une quantité long
et à une val
, vous voulez qu'elles apparaissent dans la même ligne.
En outre, vous souhaitez que l'ordre des lignes de chaque colonne suive les positions de chaque tableau afin d'obtenir le cadre de données suivant:
lat lon val
0 10 100 17
1 20 102 2
2 30 103 11
3 20 105 86
... ... ... ...
Donc, fondamentalement, la première ligne du cadre de données stocke les "premières" quantités de chaque tableau, et ainsi de suite. Comment faire ça?
Je ne pouvais pas trouver un moyen de le faire en pythonique, donc toute aide sera grandement appréciée.
Je pense que l’approche la plus simple consiste à aplatir les tableaux en utilisant ravel :
df = pd.DataFrame({'lat': lat.ravel(), 'long': long.ravel(), 'val': val.ravel()})
print (df)
lat long val
0 10 100 17
1 20 102 2
2 30 103 11
3 20 105 86
4 11 101 84
5 33 102 1
6 21 100 9
7 20 102 5
8 10 103 10
Quelque chose comme ça -
# Create stacked array
In [100]: arr = np.column_stack((lat.ravel(),long.ravel(),val.ravel()))
# Create dataframe from it and assign column names
In [101]: pd.DataFrame(arr,columns=('lat','long','val'))
Out[101]:
lat long val
0 10 100 17
1 20 102 2
2 30 103 11
3 20 105 86
4 11 101 84
5 33 102 1
6 21 100 9
7 20 102 5
8 10 103 10
Test d'exécution -
In [103]: lat = np.random.Rand(30,30)
In [104]: long = np.random.Rand(30,30)
In [105]: val = np.random.Rand(30,30)
In [106]: %timeit pd.DataFrame({'lat': lat.ravel(), 'long': long.ravel(), 'val': val.ravel()})
1000 loops, best of 3: 452 µs per loop
In [107]: arr = np.column_stack((lat.ravel(),long.ravel(),val.ravel()))
In [108]: %timeit np.column_stack((lat.ravel(),long.ravel(),val.ravel()))
100000 loops, best of 3: 12.4 µs per loop
In [109]: %timeit pd.DataFrame(arr,columns=('lat','long','val'))
1000 loops, best of 3: 217 µs per loop
Pas besoin de défiler d'abord. Vous pouvez juste empiler et aller.
lat, long, val = np.arange(5), np.arange(5), np.arange(5)
arr = np.stack((lat, long, val), axis=1)
cols = ['lat', 'long', 'val']
df = pd.DataFrame(arr, columns=cols)
lat long val
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4