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 NumPyLien externe.

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 depuis et vers des 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ésLien externe.

Créez un tableau NumPy structuré.

import numpy
arr = 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
out_fc = 'C:/data/texas.gdb/fd/pointlocations'
# Create a numpy array with an id field, and a field with a tuple 
#  of x,y coordinates arr = 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 spatial_ref = 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(arr, out_fc, ['XY'], spatial_ref)

fonctions arcpy.da permettant d'utiliser des tables et des données d'entité

FonctionsExplication
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.

arr = arcpy.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 champdtype NumPy

Single

numpy.float32

Double

numpy.float64

SmallInteger

numpy.int32

Integer

numpy.int32

OID

numpy.int32

GUID

<U64

String

<u1, <u10, etc.

Date

<M8[us]

Remarque :

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 présente une valeur <u20.

Les autres types de champ non répertoriés ci-dessus, notamment 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.

JetonDescription

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

Un tableau nécessitant plus de mémoire que le volume disponible échouera en générant une exception MemoryError.

Voici quelques 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 NumPyNombre d'octets par valeur

<U1

4

numpy.int32

4

numpy.float32

4

numpy.float64

8

Remarque :

numpy.nbytes renvoie un dictionnaire de dtypes et un nombre d'octets.

Utilisation des rasters

Les rasters peuvent être convertis en tableaux NumPy, et inversement, à l’aide des fonctions ArcPy RasterToNumPyArray et NumPyArrayToRaster. Vous pouvez convertir un raster ArcGIS en tableau NumPy pour effectuer les actions suivantes :

  • 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 arcpy permettant d'utiliser des rasters

FonctionsExplication
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")