ArcGIS 中的 NumPy

Numerical Python (NumPy) 是用于在 Python 中进行科学计算(包括支持功能强大的多维数组对象)的基础包。 NumPy 用于执行复杂的数学运算。 有关详细信息,请参阅 NumPy 网站

NumPy 数组专用于处理大型数组。 很多现有 Python 函数都是为了处理 NumPy 数组而创建的,NumPy 数组是包含在 Python 的 SciPy 科学计算包中的最著名数组。

表和要素数据

表和要素类可以使用数据访问 (arcpy.da) 模块中的函数转换为 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 数组中的整型字段不支持空值。 如果使用 FeatureClassToNumPyArrayTableToNumPyArray 转换的数据包含空值,系统会完全跳过包含空值的行,或使用替代值将其掩膜。

跳过所有包含空值的记录。

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

使用字典掩膜拥有不同值的整型字段中的每个 None

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

类型转换

创建的数组的 dtype 对象由输入表或要素类的字段类型确定。

字段类型NumPy dtype

短整型

<i4

长整型

<i4

大整数

<i8

浮点型

<f4

双精度

<f8

文本

<u1<u10 等,具体取决于字段长度。

日期

<M8[s]<M8[us],具体取决于日期字段的精度。

仅日期

<M8[D]

仅时间

<m8[us]<m8[us]

时间戳偏移

<M8[us]

对象 ID

<i8

Guid

<u38

Global ID

<u38

注:

字符串字段转换为数组后,宽度保持不变。 例如,宽度为 20 的字符串字段转换为数组后,dtype<u20

不支持以上未列出的其他字段类型,包括栅格和 BLOB 字段。 也不支持几何字段,但可以使用下面的令牌向数组添加多个几何属性:

令牌描述

SHAPE@XY

一组要素的质心 x,y 坐标。

SHAPE@XYZ

一组要素的质心 x,y,z 坐标。

SHAPE@TRUECENTROID

一组要素的质心 x,y 坐标。 这会返回与 SHAPE@XY 相同的值。

SHAPE@X

要素的双精度 x 坐标。

SHAPE@Y

要素的双精度 y 坐标。

SHAPE@Z

要素的双精度 z 坐标。

SHAPE@M

要素的双精度 m 值。

SHAPE@JSON

表示几何的 Esri JSON 字符串。

SHAPE@WKB

OGC 几何的熟知二进制 (WKB) 表示。 用于以可移植的方式将几何值表示为连续的字节流。

SHAPE@WKT

OGC 几何的熟知文本 (WKT) 表示。 用于以可移植的方式将几何值表示为文本字符串。

SHAPE@AREA

要素的双精度面积。

SHAPE@LENGTH

要素的双精度长度。

OID@

“对象 ID”字段的值。

内存注意事项

如果数组需要的内存大于可用内存,则该数组将因 MemoryError 异常而失败。

要避免 MemoryError 例外,请遵循以下提示:

  • 使用后删除数组对象;删除数组会释放内存。
  • 仅使用需要的字段,尤其对于文本字段;将文本字段转换为数组后,每个字符宽度将占用 4 个字节。 例如,宽度为 100 的字符串字段将在内存中为数组中的每个值占用 400 个字节。
注:

numpy.nbytes 将返回 dtype 的字典和字节数。

栅格

您可以使用 ArcPy 函数 RasterToNumPyArrayNumPyArrayToRaster 将栅格与 NumPy 数组相互转换。 您可能想要将 ArcGIS 栅格转换为 NumPy 数组以执行以下操作:

  • 执行可以应用到 NumPy 数组上的许多现有 Python 函数中的一个(例如,对数据运行过滤器、执行多维分析或使用优化例程)。
  • 通过访问 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")

在本主题中
  1. 表和要素数据
  2. 栅格