2016-05-14 14 views
2

numpy配列の特定の辞書値のベクトルを取得しようとしています。ここでは、配列がどのように見えるかです:。配列内の辞書値のベクトルを取得する、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'}]]) 

私はすなわち10017005(各行の最初の2つの値のためのベクトルを持っているが、私は'lanes'に関連付けられた値のために別のベクトルを必要とする

ここ私のコードは、これまでのところです:

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

次のように私が手にエラーがある:

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

さらなる説明が必要な場合はお知らせください、ありがとうございます!

+0

この配列の 'dtype'は' object'です。 'edge_array [:、2]'は、機能的には辞書のリストと同じです。したがって、リスト操作(マップ、理解)を使用して個々の辞書を操作する必要があります。 – hpaulj

答えて

5

部分式2['lanes']は意味がありません:あなたは数2

にインデックス付けされている代わりに、試してみてください。

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

または:

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

を上記のあなたを与えるだろう通常のPython list; NumPy配列が必要な場合は、リストにnp.array()を呼び出す必要があります。

ただし、ここでのより良い解決策は、名前付き列を持つ「構造化配列」にデータを変換し、名前で効率的に索引付けすることです。配列に多数の行がある場合、これは効率に大きな影響を与えます。

+0

私はそれを試してみると、次のエラーが発生します: 'lane_values = edge_array [:, 2] ['lanes'] IndexError:整数、スライス(': ')、省略記号(' ... ')、numpy.newaxis ( 'None')と整数またはブール配列が有効なインデックスです –

+1

@AndrewEarl:正確な入力データで質問を更新したので、正確な解答で私の答えを更新しました。 –

+0

魅力的な作品!ありがとう。私は多くの、多くの、多くの行があるので、構造化された配列を作ることに目を向けます。 –

2

これは完全に動作する例ではありません。それを扱うのは難しいです。タイプは不明です。私は疑問に思っています、あなたは何とかnumpyで作業しますが、うーん、伝えにくいです。

すべての手段で、2 ['something']のインデックスは正しくないため、その理由がわかります。整数のキーでインデックスを作成しようとしています。 python/numpyで索引付けがどのように行われるかを調べてください。

しかし、これはあなたあなたの 'レーン' を抽出することができる方法である:

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

numpyのスタイルで多く:

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

こんにちは、ありがとう、今それを試してみましょう。完全に実用的な例を作成することをどのように提案しますか? 'edge_array'があなたのコードで動作しないからですか? –

+0

問題は、印刷された出力を示しただけなので、カンマが省略されているため、有効なPython構文ではありませんでした。また、リストやインデックスの配列をインデックス化するかどうかは不明でした。 – sascha

+0

私は数が少ない配列で作業しており、編集しました。申し訳ありませんがアマチュアですが、いったん実装したら 'map(lambda x:x ['lanes']、edge_array [:, 2]))' '車線 'の値からベクトルを作成するにはどうすればいいですか? –

0

を@Zwinckは、構造化された配列を示唆しました。これを行う1つの方法があります

辞書部分のdtypeを定義します。それは異なるdtypeのフィールドを持っています

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

dtypeをより大きなものに埋め込みます。最初の2つの値にサブアレイフォーマットを使用しました。

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

ここで、アレイを作成します。あなたの表現を編集してdtに合わせました。タプルとリストの組み合わせは重要です。代わりにあなたのオブジェクト配列からデータを転送することができます(todo?彼らはあるので、「レーン」がフィールド名索引(の二重のアプリケーションがアクセスしている間

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

:今すぐ2つのint型の値が「F0」フィールド名でアクセスすることができます)

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) 

フィールド内のフィールド):

In [514]: edge_array1['f1']['lanes'] 
Out[514]: array([ 9, 10, 7]) 
関連する問題