2011-03-03 73 views
0

我很欣賞這可能不是直接可能的,所以我會對如何解決一般情況下的這個問題感興趣。 我有一個看起來像這樣的列表項,[(array,time),(array,time)...]該數組是一個numpy數組,它可以具有任意n乘m維。這看起來像array[[derivatives dimension1],[derivatives dimension 2] ...]Python:根據輸入從列表中獲取項目

從列表中我想要一個函數來創建兩個列表,其中將包含傳遞給它的位置的所有值。這些可以用於繪圖。 我可以想辦法用替代數據結構來做到這一點,但不幸的是,這不是一種選擇。

基本上我想要的是

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

哪裏i pos1相當於i[n][m] 真正的問題是,當它是1 1,所以我不能只傳遞整數。 任何建議將是偉大的,對不起,這篇文章有點長,我想澄清。 謝謝

+0

退房HTTP: //stackoverflow.com/editing-help以更可讀的方式格式化您的問題。 – JoshAdel 2011-03-03 18:23:16

+0

'i [n] [m]'中的'n'和'm'是什麼? – nmichaels 2011-03-03 18:26:41

+0

讓所有陣列具有相同的尺寸? – 2011-03-03 18:31:51

回答

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時,你可以稱它爲array [i],當它是2d時,你可以將它稱爲數組[i] [j],而不需要兩個單獨的情況,我不知道如何處理它。 – Roobs 2011-03-03 19:12:30

+0

@Roobs:通過使用arr.reshape將所有東西都變成二維數組。 – Autoplectic 2011-03-03 19:35:20

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