Utilisation de NumPy dans ArcGIS
Numerical Python (NumPy) est un paquetage fondamental destiné à réaliser des calculs scientifiques dans Python, qui prend notamment en charge un objet de tableau dimensionnel N puissant. NumPy permet d'effectuer des opérations mathématiques complexes et fait partie de l'installation du logiciel ArcGIS depuis la version 9.2. Pour en savoir plus, consultez le site Web NumPy.
Un tableau NumPy Python est conçu pour gérer des tableaux volumineux. De nombreuses fonctions Python existantes ont été créées pour traiter des tableaux NumPy, la plus importante étant contenue dans le paquetage d'informatique scientifique SciPy pour Python.
Utilisation des tables et des données d'entité
Les tables et classes d'entités peuvent être converties en tableaux NumPy à l'aide des fonctions du module d'accès aux données (arcpy.da).
Pour convertir des tableaux NumPy en tables et classes d'entités, les tableaux doivent être structurés. Les tableaux structurés incluent des champs (ou structures) qui permettent d'associer les données au champ dans la table ArcGIS et les classes d'entités. Pour plus d'informations sur les tableaux structurés, reportez-vous à la rubrique Tableaux structurés.
Créez un tableau NumPy structuré.
import numpy
array = numpy.array([(471316.383, 5000448.782), (470402.493, 5000049.216)],
numpy.dtype([('X', '>f8'),('Y', '>f8')]))
Une fois créé, un tableau NumPy structuré peut être converti en classe d'entités ou table.
Convertissez un tableau NumPy en classe d'entités de géodatabase.
import arcpy
import numpy
outFC = "C:/data/texas.gdb/fd/pointlocations"
# Create a numpy array with an id field, and a field with a tuple
# of x,y coordinates
array = numpy.array([(1, (471316.3835861763, 5000448.782036674)),
(2, (470402.49348005146, 5000049.216449278))],
numpy.dtype([('idfield', numpy.int32),('XY', '<f8', 2)]))
# Define a spatial reference for the output feature class
SR = arcpy.Describe("C:/data/texas.gdb/fd").spatialReference
# Export the numpy array to a feature class using the XY field to
# represent the output point feature
arcpy.da.NumPyArrayToFeatureClass(array, outFC, ['XY'], SR)
Fonctions | Explication |
---|---|
ExtendTable | Joignez le contenu d'un tableau structuré NumPy à une table en fonction d'un champ attributaire commun. |
FeatureClassToNumPyArray | Convertissez une classe d'entités en tableau structuré NumPy. |
NumPyArrayToFeatureClass | Convertissez un tableau structuré NumPy en classe d'entités. |
NumPyArrayToTable | Convertissez un tableau structuré NumPy en table. |
TableToNumPyArray | Convertissez une table en tableau structuré NumPy. |
Les champs de nombres entiers dans les tableaux NumPy ne prennent pas en charge les valeurs Null. Si les données converties à l'aide de FeatureClassToNumPyArray ou TableToNumPyArray contiennent des valeurs Null, les lignes contenant ces valeurs doivent être entièrement ignorées ou masquées par une valeur de remplacement.
Ignorez tous les enregistrements qui incluent une valeur Null.
array = da.FeatureClassToNumPyArray(fc, fields, skip_nulls=True)
Masquez les valeurs None dans les champs de nombres entiers par d'autres valeurs à l'aide d'un dictionnaire.
fields = ['field1', 'field2']
arcpy.da.FeatureClassToNumPyArray(fc, fields, null_value=-9999)
Conversions de types
Les dtypes du tableau créé sont déterminés à partir du type de champ de la table ou de la classe d'entités en entrée.
Type de champ | dtype NumPy |
---|---|
Simple | numpy.float32 |
Double | numpy.float64 |
SmallInteger | numpy.int32 |
Entier | numpy.int32 |
OID | numpy.int32 |
GUID | <U64 |
Chaîne | <u1, <u10, etc. |
Les champs de chaînes convertis en tableau ont la même largeur. Par exemple, un champ de chaîne d'une largeur de 20 a un dtype de <u20.
Les autres types de champs non répertoriés ci-dessus, notamment date, raster et BLOB, ne sont pas pris en charge. Les champs de géométrie ne sont pas pris en charge non plus, mais il est possible d'ajouter plusieurs propriétés de géométrie au tableau grâce aux jetons spéciaux répertoriés ci-après.
Jeton | Description |
---|---|
SHAPE@XY | Coordonnées x, y du centroïde de l'entité |
SHAPE@TRUECENTROID | Coordonnées x, y réelles du centroïde de l'entité |
SHAPE@X | Coordonnée x de l'entité |
SHAPE@Y | Coordonnée y de l'entité |
SHAPE@Z | Coordonnée z de l'entité |
SHAPE@M | Valeur m de l'entité |
SHAPE@AREA | Surface de l'entité |
SHAPE@LENGTH | Longueur de l'entité |
Remarques concernant la mémoire
NumPy préalloue la mémoire lors de la création de tableaux. Un tableau nécessitant plus de mémoire qu'il n'en dispose échouera avec une exception MemoryError.
Conseils pour éviter les exceptions MemoryError :
- Supprimez les objets tableaux après utilisation, ce qui libère de la mémoire.
- Utilisez uniquement les champs dont vous avez besoin ; un champ de texte converti en tableau consomme 4 octets pour chaque caractère de largeur. Par exemple, un champ de chaîne d'une largeur de 100 consomme 400 octets de mémoire pour chaque valeur du tableau.
dtype NumPy | Nombre d'octets par valeur |
---|---|
<U1 | 4 |
numpy.int32 | 4 |
numpy.float32 | 4 |
numpy.float64 | 8 |
numpy.nbytes renvoie un dictionnaire de dtypes et un nombre d'octets.
Utilisation des rasters
Un raster peut être converti en tableaux NumPy à l'aide des fonctions ArcPy RasterToNumPyArray et NumPyArrayToRaster. Vous pouvez convertir un raster ArcGIS en tableau NumPy pour :
- Implémenter une des nombreuses fonctions Python existantes pouvant s'appliquer à un tableau NumPy (par exemple, exécuter des filtres sur les données, effectuer une analyse multidimensionnelle ou utiliser des routines d'optimisation) ;
- développer une fonction personnalisée en accédant aux cellules individuelles dans le tableau NumPy (par exemple, pour implémenter la notation de voisinage, modifier des valeurs de cellules individuelles ou exécuter des opérateurs cumulés sur un raster entier).
Fonctions | Explication |
---|---|
RasterToNumPyArray | Convertissez un raster en tableau NumPy. |
NumPyArrayToRaster | Convertissez un tableau NumPy en raster. |
Un raster est converti en tableau NumPy pour calculer le pourcentage de la valeur de cellule dans l'intégralité de la ligne du raster. Un nouveau raster est alors créé.
import arcpy
import numpy
my_array = arcpy.RasterToNumPyArray('C:/data/inRaster')
my_array_sum = my_array.sum(1)
my_array_sum.shape = (my_array.shape[0], 1)
my_array_perc = (my_array * 1.0) / my_array_sum
new_raster = arcpy.NumPyArrayToRaster(my_array_perc)
new_raster.save("C:/output/fgdb.gdb/PercentRaster")