2016-05-14 10 views
2

Ich versuche, einen Vektor von spezifischen Wörterbuch-Werten zu erhalten, die in einer anzahligen Reihe sind. Hier ist, was das Array wie folgt aussieht:.Einen Vektor von Wörterbuch-Werten in einem Array erhalten, python

import numpy as np 
edge_array = np.array(
    [[1001, 7005, {'lanes': 9, 'length': 0.35, 'type': '99', 'modes': 'cw'}], 
    [1001, 8259, {'lanes': 10, 'length': 0.46, 'type': '99', 'modes': 'cw'}], 
    [1001, 14007, {'lanes': 7, 'length': 0.49, 'type': '99', 'modes': 'cw'}]]) 

ich einen Vektor für die ersten beiden Werte jeder Zeile (dh 1001 und 7005, aber ich brauche noch einen Vektor für die mit 'lanes' verknüpften Werte

hier so weit ist mein Code:

row_idx = edge_array[:, 0] 
col_idx = edge_array[:, 1] 
lane_values = edge_array[:, 2['lanes']] 

Der Fehler I ist wie folgt:

lane_values = edge_array[:, 2['lanes']] 
TypeError: 'int' object has no attribute '__getitem__' 

Bitte lassen Sie mich wissen, wenn Sie weitere Erläuterungen benötigen, danke!

+0

Beachten Sie, dass der 'dtype' dieses Arrays 'Objekt' ist. 'edge_array [:, 2]' ist funktional das Gleiche wie eine Liste von Wörterbüchern. Sie müssen also eine Liste Operationen (Karte, Verständnis) für die einzelnen Wörterbücher verwenden. – hpaulj

Antwort

5

Die subexpression 2['lanes'] macht keinen Sinn: Sie indizieren in die Nummer 2.

Stattdessen versuchen:

[rec['lanes'] for rec in edge_array[:, 2]] 

Oder:

import operator 
map(operator.itemgetter('lanes'), edge_array[:,2]) 

Die Sie oben geben ein reguläre Python list; Wenn Sie ein NumPy-Array möchten, müssen Sie np.array() in der Liste aufrufen.

Aber die bessere Lösung hier ist, Ihre Daten in ein "strukturiertes Array" zu transformieren, das Spalten benannt hat und dann effizient nach Namen indexieren kann. Wenn Ihr Array viele Zeilen enthält, hat dies einen großen Einfluss auf die Effizienz.

+0

Ich bekomme den folgenden Fehler, wenn ich das versuche: 'lane_values ​​= kanten_array [:, 2] ['lanes'] IndexError: nur ganze Zahlen, Scheiben (': '), Ellipse (' ... '), numpy.newaxis ('None') und Integer- oder Boolean-Arrays sind gültige Indizes' –

+1

@AndrewEarl: Nachdem Sie Ihre Frage nun mit den genauen Eingabedaten aktualisiert haben, habe ich meine Antwort mit einer exakten Lösung aktualisiert. –

+0

Funktioniert wie ein Charme! Vielen Dank. Ich werde ein strukturiertes Array erstellen, da ich viele, viele, viele Zeilen habe. –

2

Dies ist kein voll funktionsfähiges Beispiel. Schwer damit zu arbeiten. Die Arten sind unklar. Ich vermute, dass du irgendwie mit Nummern arbeitest, aber naja, schwer zu sagen.

In allen Fällen ist die Indizierung mit 2 ['etwas'] falsch und der Fehler sagt Ihnen warum. Es wird versucht, mit einem Schlüssel in einer Ganzzahl zu indizieren. Sehen Sie nach, wie die Indexierung in Python/Numpy durchgeführt wird.

Aber das ist, wie Sie Ihre 'Spuren' extrahieren könnte:

map(lambda x: x['lanes'], edge_array[:, 2])) 
# OR (if you want a vector/np-array) 
vec_of_lanes = np.array(map(lambda x: x['lanes'], edge_array[:, 2]))) 

Mehr in numpy-style:

vec_of_lanes = np.apply_along_axis(lambda x: x[2]['lanes'], 1, edge_array) 
+0

Hallo, danke, werde es jetzt versuchen. Wie würden Sie vorschlagen, ein voll funktionierendes Beispiel zu erstellen? Liegt es daran, dass das 'edge_array' in Ihrem Code nicht funktioniert? –

+0

Das Problem war, dass Sie uns gerade die gedruckte Ausgabe gezeigt haben, also ist es keine gültige Python-Syntax, da Kommata weggelassen werden. Es war auch nicht klar, ob Sie Listen oder Nummernfelder indexieren. – sascha

+0

Ok, ich arbeite mit einem Nummernfeld und habe das bearbeitet. Tut mir leid, Amateur zu sein, aber sobald ich implementiert habe: 'map (lambda x: x ['lanes'], edge_array [:, 2]))' Wie erstelle ich einen Vektor aus den Werten von 'lanes'? –

0

@Zwinck eine strukturierte Anordnung vorgeschlagen. Hier ist eine Möglichkeit

Definieren Sie einen dtype für den Wörterbuchteil. Es hat Felder mit verschiedenen dtypes

dt1 = np.dtype([('lanes',int), ('length',float), ('type','S2'),('modes','S2')]) 

Embed dieses dtype in einem größeren. Ich habe ein Sub-Array-Format für die ersten 2 Werte verwendet:

dt = np.dtype([('f0',int,(2,)), ('f1',dt1)]) 

Jetzt erstellen Sie das Array. Ich habe Ihren Ausdruck so bearbeitet, dass er in dt passt. Die Mischung aus Tupeln und Listen ist wichtig. Ich hätte stattdessen die Daten von Ihrem Objekt-Array übertragen können (todo?

)
edge_array1 = np.array( 
    [([1001, 7005], (9, 0.35, '99','cw')), 
    ([1001, 8259], (10, 0.46, '99','cw')), 
    ([1001, 14007], (7, 0.49, '99', 'cw'))], dtype=dt) 

Nun sind die 2 int-Werte können durch die ‚f0‘ Feldnamen zugegriffen werden:

In [513]: edge_array1['f0'] 
Out[513]: 
array([[ 1001, 7005], 
     [ 1001, 8259], 
     [ 1001, 14007]]) 

während ‚Spuren‘ sind durch eine doppelte Anwendung von Feldnamen Indizierung zugegriffen wird (da sie eine sind Feld innerhalb des Feldes):

In [514]: edge_array1['f1']['lanes'] 
Out[514]: array([ 9, 10, 7]) 
Verwandte Themen