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 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ésLien externe.

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 arcpy.da permettant d'utiliser des tables et des données d'entité

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.

RemarqueRemarque :

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

RemarqueRemarque :

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 :

  1. 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) ;
  2. 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

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")
5/10/2014