在 ArcGIS 中使用 NumPy
Numerical Python (NumPy) 是一个用于在 Python 中进行科学计算(包括支持功能强大的多维数组对象)的基础包。NumPy 为用户提供了执行复杂数学运算的途径,而且在 9.2 版本之后已作为 ArcGIS 软件安装过程的一部分。有关详细信息,请参阅 NumPy 网站。
Python NumPy 数组专用于处理大型数组。很多现有 Python 函数都是为了处理 NumPy 数组而创建的,NumPy 数组是包含在 Python 的 SciPy 科学计算包中的最著名数组。
使用表和要素数据
表和要素类可以使用数据访问 (arcpy.da) 模块中的函数转换为 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 数组中的整型字段不支持空值。如果使用 FeatureClassToNumPyArray 或 TableToNumPyArray 转换的数据包含空值,系统会完全跳过包含空值的行,或使用替代值将其掩膜。
跳过所有包含空值的记录。
array = da.FeatureClassToNumPyArray(fc, fields, skip_nulls=True)
使用字典掩膜拥有不同值的整型字段中的“无”。
fields = ['field1', 'field2']
arcpy.da.FeatureClassToNumPyArray(fc, fields, null_value=-9999)
类型转换
创建数组的 dtype 取决于输入表的字段类型或要素类。
字段类型 | NumPy dtype |
---|---|
单精度 | numpy.float32 |
双精度 | numpy.float64 |
SmallInteger | numpy.int32 |
整型 | numpy.int32 |
OID | numpy.int32 |
GUID | <U64 |
字符串 | <u1、<u10 等 |
字符串字段转换为数组后,宽度保持不变。例如,宽度为 20 的字符串字段转换为数组后,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 数组,也可以使用同样的函数从这些数组反向转换。您可能想要将 ArcGIS 栅格转换为 NumPy 数组以:
- 执行可以应用到 NumPy 数组上的许多现有 Python 函数中的一个(例如,对数据运行过滤器、执行多维分析或使用优化例程)。
- 通过访问 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")