python
  • numpy
  • genfromtxt
  • 2016-04-23 3 views 0 likes 
    0

    ich folgendes haben:Numpy der genfromtxt gibt verschiedene strukturierte Daten in Abhängigkeit von D-Typ-Parameter

    from numpy import genfromtxt  
    seg_data1 = genfromtxt('./datasets/segmentation.all', delimiter=',', dtype="|S5") 
    seg_data2 = genfromtxt('./datasets/segmentation.all', delimiter=',', dtype=["|S5"] + ["float" for n in range(19)]) 
    
    print seg_data1 
    print seg_data2 
    
    print seg_data1[:,0:1] 
    print seg_data2[:,0:1] 
    

    es stellt sich heraus, dass seg_data1 und seg_data2 sind nicht die gleiche Art von Struktur. Hier ist, was gedruckt:

    [['BRICK' '140.0' '125.0' ..., '7.777' '0.545' '-1.12'] 
    ['BRICK' '188.0' '133.0' ..., '8.444' '0.538' '-0.92'] 
    ['BRICK' '105.0' '139.0' ..., '7.555' '0.532' '-0.96'] 
    ..., 
    ['CEMEN' '128.0' '161.0' ..., '10.88' '0.540' '-1.99'] 
    ['CEMEN' '150.0' '158.0' ..., '12.22' '0.503' '-1.94'] 
    ['CEMEN' '124.0' '162.0' ..., '14.55' '0.479' '-2.02']] 
    [ ('BRICK', 140.0, 125.0, 9.0, 0.0, 0.0, 0.2777779, 0.06296301, 0.66666675, 0.31111118, 6.185185, 7.3333335, 7.6666665, 3.5555556, 3.4444444, 4.4444447, -7.888889, 7.7777777, 0.5456349, -1.1218182) 
    ('BRICK', 188.0, 133.0, 9.0, 0.0, 0.0, 0.33333334, 0.26666674, 0.5, 0.077777736, 6.6666665, 8.333334, 7.7777777, 3.8888888, 5.0, 3.3333333, -8.333333, 8.444445, 0.53858024, -0.92481726) 
    ('BRICK', 105.0, 139.0, 9.0, 0.0, 0.0, 0.27777782, 0.107407436, 0.83333325, 0.52222216, 6.111111, 7.5555553, 7.2222223, 3.5555556, 4.3333335, 3.3333333, -7.6666665, 7.5555553, 0.5326279, -0.96594584) 
    ..., 
    ('CEMEN', 128.0, 161.0, 9.0, 0.0, 0.0, 0.55555534, 0.25185192, 0.77777785, 0.16296278, 7.148148, 5.5555553, 10.888889, 5.0, -4.7777777, 11.222222, -6.4444447, 10.888889, 0.5409177, -1.9963073) 
    ('CEMEN', 150.0, 158.0, 9.0, 0.0, 0.0, 2.166667, 1.6333338, 1.388889, 0.41851807, 8.444445, 7.0, 12.222222, 6.111111, -4.3333335, 11.333333, -7.0, 12.222222, 0.50308645, -1.9434487) 
    ('CEMEN', 124.0, 162.0, 9.0, 0.11111111, 0.0, 1.3888888, 1.1296295, 2.0, 0.8888891, 10.037037, 8.0, 14.555555, 7.5555553, -6.111111, 13.555555, -7.4444447, 14.555555, 0.4799313, -2.0293121)] 
    [['BRICK'] 
    ['BRICK'] 
    ['BRICK'] 
    ..., 
    ['CEMEN'] 
    ['CEMEN'] 
    ['CEMEN']] 
    Traceback (most recent call last): 
        File "segmentationdata.py", line 14, in <module> 
        print seg_data2[:,0:1] 
    IndexError: too many indices for array 
    

    ich eher genfromtxt Rückgabedaten in Form von seg_data1 haben würde, obwohl ich nicht jede integrierte Möglichkeit wissen zu seg_data2 zu zwingen, auf diese Art zu entsprechen. Soweit ich weiß, gibt es keine einfache Möglichkeit, zu tun:

    seg_target1 = seg_data1[:,0:1] 
    seg_data1 = seg_data1[:,1:] 
    

    für seg_data2. Jetzt könnte ich data.astype(float) tun, aber der Punkt ist, ist das nicht, was genfromtxt sollte getan haben, mit zu beginnen, als ich es gab, dass dtype Array?

    +0

    (dtype Syntax schwierig sein kann) zu entwickeln, was zum Teufel ist '[ "| S5"] + [ "float" für n im Bereich (19)] soll für den dtype stehen? –

    +1

    Ich verstehe nicht ganz, was Sie zu tun versuchen. Du sagst, dass du lieber "genfromtxt" Daten in der Form von "seg_data1" zurückgeben würdest *, was ist also falsch an "seg_data1", wie du es generiert hast? Es sieht so aus, als könnten Sie * Felder * in einem strukturierten Array mit * Spalten * in einem mehrdimensionalen Array verwirren. Felder können unterschiedliche Dtypes haben, aber Spalten können nicht. Wenn Sie eine Datenstruktur haben möchten, in der die "Spalten" unterschiedliche dtypes haben können, dann sollten Sie einen ['pandas.DataFrame'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas. DataFrame.html) statt. –

    +0

    Verwendet ein 'panda.DataFrame' ein strukturiertes Array, um seine Daten zu speichern? Oder ein 'dtype = object' Array? Oder je nachdem, was bequem ist? – hpaulj

    Antwort

    3

    Mit dtype="|S5" importieren Sie alle Spalten als Strings (5 char). Das Ergebnis ist eine 2D-Array mit Reihen wie

    ['BRICK' '140.0' '125.0' ..., '7.777' '0.545' '-1.12'] 
    

    Mit dtype=["|S5"] + ["float" for n in range(19)] Sie dtype für jede Spalte angeben, ist das Ergebnis ein strukturiertes Array. Es ist 1d mit 20 Feldern. Sie greifen auf die Felder nach Namen zu (siehe set_data2.dtype), nicht nach Spaltennummer.

    Ein Element oder Aufzeichnung, von diesem Array wird als ein Tupel angezeigt und enthält eine Zeichenfolge und 19 Hin- und Herbewegungen:

    ('BRICK', 140.0, 125.0, 9.0, 0.0, 0.0, 0.2777779, 0.06296301, 0.66666675, 0.31111118, 6.185185, 7.3333335, 7.6666665, 3.5555556, 3.4444444, 4.4444447, -7.888889, 7.7777777, 0.5456349, -1.1218182) 
    

    # die Anfangszeichenspalte

    print set_data2['f0'] 
    

    dtype=None Angeben sollte produzieren das gleiche, möglicherweise mit einigen Integer-Spalten anstelle von allen Floats.

    Es ist auch möglich, einen dtype mit 2 Feldern anzugeben, von denen eines die String-Spalte und das andere die 19 Floats ist. Ich müsste die Dokumente überprüfen und ein paar Testfälle ausführen, um das Format zu überprüfen.

    Ich denke, Sie lesen genug von genfromtxt Docs, um zu sehen, dass Sie eine Verbindung dtype angeben können, aber nicht genug, um die Ergebnisse zu verstehen.

    =================

    Beispiel csv mit Text und Zahlen importieren:

    In [139]: txt=b"""one 1 2 3 
        ...: two 4 5 6 
        ...: """ 
    

    default: alle schwimmt

    In [140]: np.genfromtxt(txt.splitlines()) 
    Out[140]: 
    array([[ nan, 1., 2., 3.], 
         [ nan, 4., 5., 6.]]) 
    

    automatische dtype Auswahl - 4 Felder

    In [141]: np.genfromtxt(txt.splitlines(),dtype=None) 
    Out[141]: 
    array([(b'one', 1, 2, 3), (b'two', 4, 5, 6)], 
         dtype=[('f0', 'S3'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4')]) 
    

    Benutzer angegebene Feld dtypes

    In [142]: np.genfromtxt(txt.splitlines(),dtype='str,int,float,int') 
    Out[142]: 
    array([('', 1, 2.0, 3), ('', 4, 5.0, 6)], 
         dtype=[('f0', '<U'), ('f1', '<i4'), ('f2', '<f8'), ('f3', '<i4')]) 
    

    Verbindung dtype, mit Spaltenanzahl für das numerische Feld (und Korrektur String-Spalte)

    In [145]: np.genfromtxt(txt.splitlines(),dtype='S5,(3)int') 
    Out[145]: 
    array([(b'one', [1, 2, 3]), (b'two', [4, 5, 6])], 
         dtype=[('f0', 'S5'), ('f1', '<i4', (3,))]) 
    
    In [146]: _['f0'] 
    Out[146]: 
    array([b'one', b'two'], 
         dtype='|S5') 
    
    In [149]: _['f1'] 
    Out[149]: 
    array([[1, 2, 3], 
         [4, 5, 6]]) 
    

    Wenn Sie Mathematik über die numerischen Feldern dieser letzte Fall tun müssen, (oder etwas Komplizierteres) könnte am bequemsten sein.

    Um etwas komplizierter zu generieren es am besten sein, die dtype in einem separaten Ausdruck

    In [172]: dt=np.dtype([('f0','|S5'),('f1',[('f10',int),('f11',float,(2))])]) 
    
    In [173]: np.genfromtxt(txt.splitlines(),dtype=dt) 
    Out[173]: 
    array([(b'one', (1, [2.0, 3.0])), (b'two', (4, [5.0, 6.0]))], 
         dtype=[('f0', 'S5'), ('f1', [('f10', '<i4'), ('f11', '<f8', (2,))])]) 
    
    Verwandte Themen