使用 numpy、arcpy 的多边形特征的平均中心 class
Mean center of polygon feature class using numpy, arcpy
我的任务是使用 numpy 数组找到特征的平均中心 class。我使用
从特征 class 创建了一个 numpy 数组
import arcpy
import numpy
fc = "polygons.shp"
a = arcpy.da.FeatureClassToNumPyArray(fc, ["SHAPE@X", "SHAPE@Y"])
数组 a 则为:
array([( 3107178.29076947, 10151024.31186805),
( 3107961.30479125, 10139810.52458512),
( 3109603.8882401 , 10119654.26424824),
( 2992362.40598316, 10049723.50515586),
....
( 3114517.82381449, 10071634.68261757)],
dtype=[('SHAPE@X', '<f8'), ('SHAPE@Y', '<f8')])
这是fc中每条记录的质心(X,Y)。如何获得这些的 meanX 和 meanY,以便输出为 ([(mean.X, mean.Y)])?我已尝试使用以下内容,如 here 所述:
numpy.mean(a, axis=0)
但我得到的只是 X 值的平均值。在 arcpy.da 函数之后是否有一些额外的步骤来更改 dtype 以成功获取 mean.X、mean.Y 值?我必须使用 numpy mean 函数来做到这一点。谢谢!
meanxy=[np.mean(y) for y in zip(*a)]
*
收集元组中的所有位置参数
np.mean(a.view((float, len(a.dtype.names))), axis=0)
可能有点矫枉过正,但是对于来自要素类的结构化 and/or 重新排列,您应该注意存在的数据类型的混合。如果一揽子升级到浮点数,整数、浮点数和字符串的混合将导致错误。您可能会被建议对您想要的字段单独或同时对特定数据类型执行实际计算。
考虑具有以下 dtype 的要素类:
a.dtype.names = ('ID', 'X', 'Y', 'Z')
平均值 'ID' 非常无用...但是,3D 坐标的平均值可能有用。要获得这些坐标的平均值,您可以将它们作为单例进行。
a['X'].mean(), a['Y'].mean(), a['Z'].mean()
(74047.105809675646, -3466195.1836807081, 418.45351408062925)
或作为一批未知长度的浮点数
[a[i].mean() for i in a.dtype.names if a[i].dtype.kind in ('f', 'float')]
产生与元组相同的结果
[74047.105809675646, -3466195.1836807081, 418.45351408062925]
并确保您记住什么是什么值...
[(i, a[i].mean()) for i in a.dtype.names if a[i].dtype.kind in ('f', 'float')]
[('X', 74047.105809675646),
('Y', -3466195.1836807081),
('Z', 418.45351408062925)]
我的任务是使用 numpy 数组找到特征的平均中心 class。我使用
从特征 class 创建了一个 numpy 数组import arcpy
import numpy
fc = "polygons.shp"
a = arcpy.da.FeatureClassToNumPyArray(fc, ["SHAPE@X", "SHAPE@Y"])
数组 a 则为:
array([( 3107178.29076947, 10151024.31186805),
( 3107961.30479125, 10139810.52458512),
( 3109603.8882401 , 10119654.26424824),
( 2992362.40598316, 10049723.50515586),
....
( 3114517.82381449, 10071634.68261757)],
dtype=[('SHAPE@X', '<f8'), ('SHAPE@Y', '<f8')])
这是fc中每条记录的质心(X,Y)。如何获得这些的 meanX 和 meanY,以便输出为 ([(mean.X, mean.Y)])?我已尝试使用以下内容,如 here 所述:
numpy.mean(a, axis=0)
但我得到的只是 X 值的平均值。在 arcpy.da 函数之后是否有一些额外的步骤来更改 dtype 以成功获取 mean.X、mean.Y 值?我必须使用 numpy mean 函数来做到这一点。谢谢!
meanxy=[np.mean(y) for y in zip(*a)]
*
收集元组中的所有位置参数
np.mean(a.view((float, len(a.dtype.names))), axis=0)
可能有点矫枉过正,但是对于来自要素类的结构化 and/or 重新排列,您应该注意存在的数据类型的混合。如果一揽子升级到浮点数,整数、浮点数和字符串的混合将导致错误。您可能会被建议对您想要的字段单独或同时对特定数据类型执行实际计算。 考虑具有以下 dtype 的要素类:
a.dtype.names = ('ID', 'X', 'Y', 'Z')
平均值 'ID' 非常无用...但是,3D 坐标的平均值可能有用。要获得这些坐标的平均值,您可以将它们作为单例进行。
a['X'].mean(), a['Y'].mean(), a['Z'].mean()
(74047.105809675646, -3466195.1836807081, 418.45351408062925)
或作为一批未知长度的浮点数
[a[i].mean() for i in a.dtype.names if a[i].dtype.kind in ('f', 'float')]
产生与元组相同的结果
[74047.105809675646, -3466195.1836807081, 418.45351408062925]
并确保您记住什么是什么值...
[(i, a[i].mean()) for i in a.dtype.names if a[i].dtype.kind in ('f', 'float')]
[('X', 74047.105809675646),
('Y', -3466195.1836807081),
('Z', 418.45351408062925)]