如何操作numpy数组以用于ESRI的arcpy.da.NumPyArrayToTable
ESRI提供了一种方法,可以把表格中的数据转移到数组中,然后再转回来。我有一个脚本,它从一个API获取人口普查数据,然后把这些数据转换成数组,进行一些简单的数学运算,最后理想情况下把结果放到一个表格里。为了进行数学运算,数组不能是记录数组(rec array)。我尝试了很多方法,比如vstack、hstack或者拼接(concatenate),但都没有得到好的结果。最后我只好创建了单独的一维数组作为记录数组,然后使用np.lib.recfunctions.merge_arrays中的合并功能。肯定还有更好的方法。
ESRI从TableToNumPyArray返回的数据:
>>> testArray
array([ (41039000100.0, 2628.0, 100.0, 2339.0, 135.0, 18.0, 22.0, 16.0, 25.0, 0.0, 92.0, 0.0, 92.0, 0.0, 92.0, 0.0, 92.0, 6.0, 9.0, 249.0, 90.0, 0.0, 92.0, 1, u'41039000100'),
...
dtype=[('Geo_id', '<f8'), ('TotalUnits', '<f8'), ('MOE_Total', '<f8'), >('Total_1_detached', '<f8'), ('MOE_Total_1_detached', '<f8'), ('Total_1_attached', >'<f8'), ('MOE_Total_1_attached', '<f8'), ('Total_2', '<f8'), ('MOE_Total_2', '<f8'), >('Total_3_or_4', '<f8'), ('MOE_Total_3_or_4', '<f8'), ('Total_5_to_9', '<f8'), >('MOE_Total_5_to_9', '<f8'), ('Total_10_to_19', '<f8'), ('MOE_Total_10_to_19', '<f8'), >('Total_20_to_49', '<f8'), ('MOE_Total_20_to_49', '<f8'), ('Total_50_or_more', '<f8'), >('MOE_Total_50_or_more', '<f8'), ('Total_Mobile_home', '<f8'), ('MOE_Total_Mobile_home', '<f8'), ('Total_Boat_RV_van_etc', '<f8'), ('MOE_Total_Boat_RV_van_etc', '<f8'), >('ObjectID', '<i4'), ('geo_id_t', '<U50')])
我的代码片段看起来像这样:
try:
# Assign Geo_id array
Geo_id_array = B25008_001E_array[...,0]
Tpop_array = B25008_001E_array[...,1]
Tunits_array = B25024_001E_array[...,1]
# divide by sero is possible for real rowns and definite for the end-of-file
# tract, so convert nan's in the HHsize_array to zero's with nan_to_num
# HHsize_array = Tpop_array.view(np.float32)/Tunits_array.view(np.float32)
HHsize_array = Tpop_array/Tunits_array
HHsize_array = nan_to_num(HHsize_array)
# Table_array = array(vstack((Geo_id_array, Tpop_array, Tunits_array, HHsize_array)), dtype = ([('Geo_id', '|S13'), ('Tpop', np.int32), ('Tunits_array', np.int32), ('HHsize', np.float32)]))
# Table_array = np.hstack((Geo_id_array, Tpop_array, Tunits_array, HHsize_array))
Geo_id_recarray = np.array(Geo_id_array, dtype = ([('Geo_id', '|S13')]))
Tpop_recarray = np.array(Tpop_array, dtype = ([('Tpop', np.int32)]))
Tunits_recarray = np.array(Tunits_array, dtype = ([('Tunits_array', np.int32)]))
HHsize_recarray = np.array(HHsize_array, dtype = ([('HHsize', np.float32)]))
arrays = [Geo_id_recarray, Tpop_recarray, Tunits_recarray, HHsize_recarray]
MergedArray = np.lib.recfunctions.merge_arrays(arrays, usemask=False)
print
print
except Exception as e:
# If an error occurred, print line number and error message
import traceback, sys
tb = sys.exc_info()[2]
print "An error occured on line %i" % tb.tb_lineno
print str(e)
我觉得在整理数组之前,最好先把它们合并、连接或堆叠起来。你怎么看?
1 个回答
1
你可以使用结构化数组(其实你并不是在使用recarrays)来进行一些“简单的数学运算”。我不太确定你想要做的数学运算是什么,但举个例子,如果你想要进行:
HHsize_array = Tpop_array/Tunits_array
但是如果你不想要那么多独立的数组,你可以直接在主数组(合并后的数组)的视图上进行计算,我们可以把这个数组叫做data
:
data['HHsize'] = data['Tpop']/data['Tunits']
这里的HHsize
、Tpop
和Tunits
都是一个名为data
的结构化数组中的字段名,也就是说你会有:
>>> data.dtype
dtype([('Geo_id', '|S13'), ('Tpop', np.int32), ('Tunits_array', np.int32), ('HHsize', np.float32)])