ArcGIS での NumPy の操作

Numpy (Numerical Python) は Python で科学技術計算を実行するための基本パッケージであり、高度な N 次元配列オブジェクトをサポートしています。ArcGIS ソフトウェア 9.2 以降に追加されている NumPy を使用すれば、複雑な算術演算を実行できます。詳細については、NumPy の Web サイト 外部リンク をご参照ください。

Python NumPy 配列は、大きな配列を操作できるように設計されています。現在、NumPy 配列を処理するために作成された多数の Python 関数があります。Python の SciPy 科学計算パッケージに含まれます。

テーブルおよびフィーチャ データの操作

データ アクセス (arcpy.da) モジュールの関数を使用して、テーブルとフィーチャクラスを NumPy 配列に変換したり、NumPy 配列をテーブルとフィーチャクラスに変換したりできます。

NumPy 配列をテーブルとフィーチャクラスに変換するには、その配列が構造化配列であることが条件となります。構造化配列は、ArcGIS テーブルのフィールドやフィーチャクラスにデータをマッピングするためのフィールド (または構造体) で構成されます。構造化配列の詳細については、構造化配列外部リンク をご参照ください。

構造化された NumPy 配列を作成します。

import numpy
arr = numpy.array([(471316.383, 5000448.782), (470402.493, 5000049.216)],
                  numpy.dtype([('X', '>f8'),('Y', '>f8')]))

構造化 NumPy 配列を作成したら、それをフィーチャクラスまたはテーブルに変換できます。

NumPy 配列をジオデータベース フィーチャクラスに変換します。

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)

テーブルとフィーチャ データを操作する arcpy.da 関数

関数説明
ExtendTable

共通の属性フィールドに基づいて、NumPy 構造化配列の内容をテーブルに結合します。

FeatureClassToNumPyArray

フィーチャクラスを NumPy 構造化配列に変換します。

NumPyArrayToFeatureClass

NumPy 構造化配列をフィーチャクラスに変換します。

NumPyArrayToTable

NumPy 構造化配列をテーブルに変換します。

TableToNumPyArray

テーブルを NumPy 構造化配列に変換します。

NumPy 配列の整数フィールドでは null を使用できません。FeatureClassToNumPyArray または TableToNumPyArray を使用して変換したデータに null が含まれている場合、null を含む行全体がスキップされるか、null が代替値でマスキングされます。

null を含むすべてのレコードをスキップします。

arr = arcpy.da.FeatureClassToNumPyArray(fc, fields, skip_nulls=True)

辞書を使用し、整数フィールドの null を別の値でマスキングします。

fields = ['field1', 'field2'] arcpy.da.FeatureClassToNumPyArray(fc, fields, null_value=-9999)

タイプ変換

作成した配列の dtype は、入力テーブルまたはフィーチャクラスのフィールド タイプから決定されます。

フィールド タイプNumPy dtype

Single

numpy.float32

Double

numpy.float64

SmallInteger

numpy.int32

Integer

numpy.int32

OID

numpy.int32

GUID

<U64

String

<u1<u10 など

Date

<M8[us]

メモ:

配列に変換された string フィールドは、同じ幅を持ちます。たとえば、幅が 20 の string フィールドの場合、dtype は <u20 になります。

ラスターや BLOB フィールドなど、上でリストされていないフィールド タイプはサポートされていません。ジオメトリ フィールドもサポートされていませんが、以下に示した特殊なトークンを使用して、複数のジオメトリ プロパティを配列に追加することができます。

トークン説明

SHAPE@XY

フィーチャの重心を表す X 座標と Y 座標

SHAPE@TRUECENTROID

フィーチャの真の重心を表す X 座標と Y 座標

SHAPE@X

フィーチャの X 座標

SHAPE@Y

フィーチャの Y 座標

SHAPE@Z

フィーチャの Z 座標

SHAPE@M

フィーチャの M 値

SHAPE@AREA

フィーチャの面積

SHAPE@LENGTH

フィールドの長さ

メモリの検討事項

使用可能なメモリより多くのメモリが必要な配列はエラーになり、MemoryError 例外が発生します。

MemoryError 例外を防ぐためのヒントを以下に示します。

  • 使用後に配列オブジェクトを削除します。配列を削除すると、メモリが解放されます。
  • 必要なフィールド、特にテキスト フィールドだけを使用します。配列に変換されたテキスト フィールドは、幅の各文字に 4 バイトを消費します。たとえば、幅 100 の文字列フィールドは、配列内の各値に 400 バイトのメモリを消費します。

NumPy dtype値あたりのバイト数

<U1

4

numpy.int32

4

numpy.float32

4

numpy.float64

8

メモ:

numpy.nbytes は、dtype の辞書とバイト数を返します。

ラスターの操作

ArcPy 関数の RasterToNumPyArray および NumPyArrayToRaster を使用して、ラスターを NumPy 配列に変換したり、NumPy 配列をラスターに変換したりできます。次を実行する場合に、ArcGIS ラスターを NumPy 配列に変換します。

  • 既存の多数の Python 関数の中で、NumPy 配列に適用する関数を実装する (たとえば、データに対してフィルターを実行する場合、多次元解析を行う場合、最適化ルーチンを使用する場合など)。
  • NumPy 配列内の個々のセルにアクセスして、独自の関数を開発する (たとえば、近傍表記を実装する場合、個々のセル値を変更する場合、ラスター全体を対象に累積操作を実行する場合など)。

ラスターを操作する arcpy 関数

関数説明
RasterToNumPyArray

ラスターを NumPy 配列に変換します。

NumPyArrayToRaster

NumPy 配列をラスターに変換します。

ラスター行全体でのセル値のパーセンテージを計算するため、ラスターを NumPy 配列に変換します。その後で、新しいラスターを作成します。

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