2016-11-22 50 views
0

下面是我與作爲一個初學者掙扎代碼:我搜查,發現沒有定義的數據類型時,此異常引發NumPy的savetxt錯誤

TypeError: float argument required, not numpy.void

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") 

錯誤是如下。但是,當我測試下面我在dilemma-

>>>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加載到數據幀大熊貓作爲如下─

df = pd.DataFrame(data=master_table[1:,1:], index=master_table[1:,0],columns=master_table[0,1:]) 

我的表數據類型: 有13個colums和master_table中的50行。第一列和最後一列數據類型分別是整數和整數,但所有其他(11)數據類型都是float。

+0

在我看來像你''master_table'是非數值的,因爲'u'1''的最後一列,它也包含python元組,而不是多維浮點數。你可能只需要重新格式化你的數據... – Julien

+0

@JulienBernu Ok編輯了這個問題。你是對的! – SIslam

+0

二維數組數組對於'savetxt'來說是最簡單的。它也可以處理1d結構化數組,但是獲得'fmt'權利可能會更棘手。代碼並不複雜 - 只需用'fmt%tuple(row)'迭代和格式化'row'即可。 numpy void是你的結構化數組的記錄。 – hpaulj

回答

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在上迭代

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更正 - 一個結構數組必須是一維與合作savetxt - 行和字段。而fmt必須與dtype一起使用。在這種情況下,你必須處理字符串字段。

如果最後一個字段已經數字(例如INT),而不是U2,將data[:,0]會用簡單的%.1f FMT工作。最初的int域保存得很好(儘管fmt也可以被調整)。