ArcGIS での NumPy の操作
Numerical Python(NumPy)は Python で科学計算を実行するための基本パッケージであり、高度な N 次元配列オブジェクトをサポートしています。ArcGIS ソフトウェア 9.2 以降に追加されている NumPy を使用すれば、複雑な算術演算を実行できます。詳細については、NumPy の Web サイトをご参照ください。
Python NumPy 配列は、大きな配列を処理できるように設計されています。現在、NumPy 配列を処理するために作成された多数の Python 関数があります。Python の SciPy 科学計算パッケージに含まれます。
テーブルおよびフィーチャ データの操作
データ アクセス(arcpy.da)モジュールの関数を使用して、テーブルとフィーチャクラスを NumPy 配列に変換したり、NumPy 配列をテーブルとフィーチャクラスに変換したりできます。
NumPy 配列をテーブルとフィーチャクラスに変換するには、その配列が構造化配列であることが条件となります。構造化配列は、ArcGIS テーブルのフィールドやフィーチャクラスにデータをマッピングするためのフィールド(または構造体)で構成されます。構造化配列の詳細については、構造化配列 をご参照ください。
構造化された NumPy 配列を作成します。
import numpy
array = numpy.array([(471316.383, 5000448.782), (470402.493, 5000049.216)],
numpy.dtype([('X', '>f8'),('Y', '>f8')]))
構造化 NumPy 配列を作成したら、それをフィーチャクラスまたはテーブルに変換できます。
NumPy 配列をジオデータベース フィーチャクラスに変換します。
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)
関数 |
説明 |
---|---|
ExtendTable |
共通の属性フィールドに基づいて、NumPy 構造化配列の内容をテーブルに結合します。 |
FeatureClassToNumPyArray |
フィーチャクラスを NumPy 構造化配列に変換します。 |
NumPyArrayToFeatureClass |
NumPy 構造化配列をフィーチャクラスに変換します。 |
NumPyArrayToTable |
NumPy 構造化配列をテーブルに変換します。 |
TableToNumPyArray |
テーブルを NumPy 構造化配列に変換します。 |
NumPy 配列の整数フィールドでは null を使用できません。FeatureClassToNumPyArray または TableToNumPyArray を使用して変換したデータに null が含まれている場合、null を含む行全体がスキップされるか、null が代替値でマスキングされます。
null を含むすべてのレコードをスキップします。
array = 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 など |
配列に変換された 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 |
フィールドの長さ |
メモリの検討事項
NumPy は、配列を作成するときに、メモリを事前に割り当てます。使用可能なメモリより多くのメモリが必要な配列はエラーになり、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 配列内の個々のセルにアクセスして、独自の関数を開発する(たとえば、近傍表記を実装する場合、個々のセル値を変更する場合、ラスタ全体を対象に累積操作を実行する場合など)。
関数 |
説明 |
---|---|
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")