下面是我作为初学者努力的代码:
commonfields = arcpy.ListFields(gt_pnts)
names = [f.name for f in commonfields]
needed_names = names[3:]
gt_pnts_arr = arcpy.da.FeatureClassToNumPyArray(gt_pnts, needed_names)
gt_pnts_arr = gt_pnts_arr.reshape((gt_pnts_arr.shape[0],1))
eq_smpled_pnts_arr = arcpy.da.FeatureClassToNumPyArray(eq_smpled_pnts, needed_names)
eq_smpled_pnts_arr = eq_smpled_pnts_arr.reshape((eq_smpled_pnts_arr.shape[0],1))
master_table = np.concatenate((gt_pnts_arr, eq_smpled_pnts_arr), axis=0)
np.savetxt(outputcsvfilename,master_table, fmt="%.1f")
错误如下:
TypeError:需要浮点参数,而不是numpy.void
我搜索并发现在未定义数据类型时引发此异常。但是当我测试如下时,我处于两难境地 -
>>>master_table.dtype.descr
>>>[('grid_code', '<i4'), ('b1_Clip_ProximityRaster1', '<f4'), ('b2_Clip_ProximityRaster1', '<f4'), ('b3_Clip_ProximityRaster1', '<f4'), ('b4_Clip_ProximityRaster1', '<f4'), ('b5_Clip_ProximityRaster1', '<f4'), ('b6_Clip_ProximityRaster1', '<f4'), ('b7_Clip_ProximityRaster1', '<f4'), ('b8_Clip_ProximityRaster1', '<f4'), ('b9_Clip_ProximityRaster1', '<f4'), ('b10_Clip_ProximityRaster1', '<f4'), ('b11_Clip_ProximityRaster1', '<f4'), ('b12_Clip_ProximityRaster1', '<f4'), ('b13_Clip_ProximityRaster1', '<f4'), ('resp', '<U2')]
>>>master_table
array([[ (13, 13.0, 3810.0, 3810.0, 1982.952392578125, 3873.71923828125, 34869.9140625, 5483.3564453125, 7272.138671875, 4409.591796875, 872.0665283203125, 36238.62109375, 4441.62109375, 6775.2861328125, u'1')],
[ (1, 1.0, 3601.99951171875, 3603.12353515625, 1626.9295654296875, 3725.922607421875, 34595.9453125, 5810.5595703125, 7592.90478515625, 4476.0361328125, 576.2811889648438, 36462.984375, 4499.0, 7164.47509765625, u'1')],
[ (13, 13.0, 3721.93505859375, 3723.02294921875, 1642.3458251953125, 3842.928466796875, 34713.43359375, 5702.3681640625, 7597.17041015625, 4562.07177734375, 657.9513549804688, 36343.12890625, 4586.9599609375, 7111.0126953125, u'1')],.....................
>>>master_table.shape
>>>(50, 1)
>>>gt_pnts_arr.shape
>>>(25, 1)
即使我无法将此master_table
加载到pandas数据框中,如下所示 -
df = pd.DataFrame(data=master_table[1:,1:], index=master_table[1:,0],columns=master_table[0,1:])
我的表数据类型:
master_table
中有13个列和50个行。第一个和最后一个列数据类型分别是整数和整数,但所有其他(11)数据类型都是浮点数。
答案 0 :(得分:1)
重新创建数据(thaxs以获取足够的信息),我制作了一个data
数组
In [33]: data.shape
Out[33]: (3, 1)
In [34]: len(data.dtype.fields)
尝试savetxt
:
In [28]: np.savetxt('test.csv',data, fmt="%.1f")
-> 1158 fh.write(asbytes(format % tuple(row) + newline))
1159 except TypeError:
TypeError: cannot convert to a float; scalar object is not a number
和次要错误:
TypeError: Mismatch between array dtype .... and format specifier ('%.1f')
savetxt
在data
for row in data:
f.write(fmt%tuple(row))
但是这个形状row
是一个(1,)数组。
但是如果我摆脱了不必要的第二维(大小1)
In [37]: np.savetxt('test.csv',data[:,0], fmt="%.1f")
TypeError: a float is required
和
TypeError: Mismatch between array dtype .... and format specifier ('%.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f')
请注意,已经使用了fmt
,并将其复制以匹配字段数。复制最后一个格式说明符,并调整它以使用最终的字符串列
In [38]: fmt='%.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %s'
现在可行:
In [39]: np.savetxt('test.csv',data[:,0], fmt=fmt)
In [40]: cat test.csv
13.0 13.0 3810.0 3810.0 1983.0 3873.7 34869.9 5483.4 7272.1 4409.6 872.1 36238.6 4441.6 6775.3 1
1.0 1.0 3602.0 3603.1 1626.9 3725.9 34595.9 5810.6 7592.9 4476.0 576.3 36463.0 4499.0 7164.5 1
13.0 13.0 3721.9 3723.0 1642.3 3842.9 34713.4 5702.4 7597.2 4562.1 658.0 36343.1 4587.0 7111.0 1
因此有2个更正 - 结构化数组必须是1d才能使用savetxt
- 行和字段。并且fmt
必须与dtype一起使用。在这种情况下,您必须处理字符串字段。
如果最后一个字段是数字(例如int)而不是U2
,则data[:,0]
可以使用简单的%.1f
fmt。初始的int字段保存得很好(尽管fmt也可以为此调整)。