2016-11-22 2 views
0

est Ci-dessous le code que je me bats avec comme un débutant:Numpy erreur savetxt

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

erreur est comme ci-dessous:

TypeError: float argument required, not numpy.void

J'ai cherché et trouvé cette exception soulevée lorsque le type de données n'est pas défini. Mais quand je test comme ci-dessous, je suis dans le 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) 

Même moi, je ne peux pas charger ce master_table dans dataframe de pandas géants comme dessous-

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

MaTable types de données: Il y a 13 et colums 50 lignes dans le master_table. Le type de données de la première et de la dernière colonne est respectivement entier et entier, mais tous les autres types de données (11) sont flottants.

+0

me semble que votre 'master_table' est non numérique à cause de la dernière colonne de' u'1'', et il contient aussi des tuples python au lieu d'être multidimensionnel avec des flottants. Vous avez probablement juste besoin de reformater vos données ... – Julien

+0

@JulienBernu Ok a édité la question. Tu as raison! – SIslam

+0

Les tableaux numériques 2d sont les plus faciles pour 'savetxt'. Il peut aussi gérer les tableaux structurés en 1d, mais obtenir le droit 'fmt' peut être plus délicat. Le code n'est pas compliqué - il suffit de répéter et de formater la 'ligne' avec 'fmt% tuple (row)'. Le vide numpy est un enregistrement de votre tableau structuré. – hpaulj

Répondre

1

Recréer vos données (thaxs pour assez d'informations), je fais un tableau data

In [33]: data.shape 
Out[33]: (3, 1) 
In [34]: len(data.dtype.fields) 

Essayer 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 

et une erreur secondaire:

TypeError: Mismatch between array dtype .... and format specifier ('%.1f') 

savetxt itère sur data

for row in data: 
    f.write(fmt%tuple(row)) 

Mais avec cette forme row est une matrice (1,).

Mais si je me débarrasser de la 2ème dimension inutile (taille 1)

In [37]: np.savetxt('test.csv',data[:,0], fmt="%.1f") 
TypeError: a float is required 

et

TypeError: Mismatch between array dtype .... and format specifier ('%.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f') 

Notez que est a pris votre fmt, et reproduit pour correspondre au nombre de champs . Copier ce dernier spécificateur de format, et apportez des modifications à travailler avec la dernière colonne de chaîne

In [38]: fmt='%.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %s' 

Maintenant il fonctionne:

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 

Donc, il y a 2 corrections - un ensemble structuré doit être 1d travailler avec savetxt - lignes et champs. Et le fmt doit fonctionner avec le type dtype. Dans ce cas, vous devez gérer le champ de chaîne.

Si le dernier champ avait été numérique (par exemple int) par opposition à U2, le data[:,0] aurait travaillé avec le simple %.1f fmt. Le champ int initial enregistre très bien (bien que le fmt pourrait également être modifié pour cela).