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)
テーブルとフィーチャ データを操作する arcpy.da 関数

関数

説明

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 配列に変換します。

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

ラスタを操作する arcpy 関数

関数

説明

RasterToNumPyArray

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

NumPyArrayToRaster

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

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

import arcpy
import numpy 

myArray = arcpy.RasterToNumPyArray('C:/data/inRaster')
myArraySum = myArray.sum(1)
myArraySum.shape = (myArray.shape[0],1)
myArrayPerc = (myArray * 1.0)/ myArraySum

newRaster = arcpy.NumPyArrayToRaster(myArrayPerc)
newRaster.save("C:/output/fgdb.gdb/PercentRaster")
9/14/2013