2011-03-03 17 views
0

これは直接可能でない可能性がありますので、私は一般的なケースでこの問題を解決する方法に興味があると思います。 私はこのようなリスト項目を持っています。[(array,time),(array,time)...]配列は、次元がn×mのnumpy配列です。これは次のようになりますarray[[derivatives dimension1],[derivatives dimension 2] ...]Python:入力に基づいてリストから項目を取得

リストから、渡された位置のすべての値を含む2つのリストを作成する関数が必要です。これらはプロットに使用できます。 私は代替データ構造でこれを行う方法を考えることはできますが、残念ながらこれはオプションではありません。

は基本的に私が欲しいもの、それはので、私はちょうど、整数を渡すことはできません1 1によってだときi pos1があることi[n][m] 本当の問題と等価である

def f(list, pos1, pos2): 
    xs = [] 
    ys = [] 
    for i in list: 
     ys.append(i pos1) 
     xs.append(i pos2) 
    return xs, ys 

です。 アドバイスがよかったです、ごめんなさい、ポストはもうちょっと長いと思いました。 ありがとう

+0

のhttpをチェックアウト: //stackoverflow.com/editing-helpよりわかりやすい形式で質問の書式を設定してください。 – JoshAdel

+0

「i [n] [m]」に「n」と「m」とは何ですか? – nmichaels

+0

すべての配列の寸法が同じですか? –

答えて

1

質問が正しく分かっていれば、リストのリストからインデックスを選択し、そのリストから新しいリストを作成することが基本です。リストのリストからインデックスを選択

は、あなたが選択の固定数を持っている場合は特に、非常に簡単です:これらの選択から新しいリストを作成

parts = [(item[pos1], item[pos2]) for item in list] 

はビルトインzip()機能を使用して、また非常に簡単です:

separated = zip(*parts) 

あなたはさらに代わりに、最終的な機能でリストの内包のジェネレータ式を使って、メモリ使用量を減らすことができます。

def f(list, pos1, pos2): 
    partsgen = ((item[pos1], item[pos2]) for item in list) 
    return zip(*partsgen) 

は、ここでそれが行動にどのように見えるかです:

>>> f([['ignore', 'a', 1], ['ignore', 'b', 2],['ignore', 'c', 3]], 1, 2) 
[('a', 'b', 'c'), (1, 2, 3)] 

更新:再読み込み、質問やコメントの後、私はこれを実現していますビットオーバー簡素化です。しかし、包含された配列への適切な索引付けのためにpos1とpos2を交換するときは、一般的な考え方は依然として有効です。

+0

ニース、私は最適化することを考えていなかったいくつかのビットがあった。本質的な問題は、配列が1dの場合、それを配列[i] [2]と呼ぶときに配列[i] [j]と呼びます。 – Roobs

+0

@ Roobs:arr.reshapeを使ってすべてを2次元配列にします。 – Autoplectic

0

私はあなたの質問を理解していれば、以下のようなものは、あなたがこれを複数回実行する必要がある場合は特に、簡単かつ迅速である必要があります。たとえば

z = np.dstack([ arr for arr, time in lst ]) 
x, y = z[pos1], z[pos2] 

を:

In [42]: a = arange(9).reshape(3,3) 
In [43]: z = np.dstack([a, a*2, a*3]) 
In [44]: z[0,0] 
Out[44]: array([0, 0, 0]) 
In [45]: z[1,1] 
Out[45]: array([ 4, 8, 12]) 
In [46]: z[0,1] 
Out[46]: array([1, 2, 3]) 
関連する問題