2014-01-09 51 views
1

我有兩個元組列表。Python - 減去元組列表中的元素

x = [(A1, B1, C1), (A2, B2, C2),...(AN, BN, CN)] 

y = [(A1_, B1_, C1_), (A2_, B2_, C2_),...(AN_, BN_, CN_)] 

我想要做以下的事情:

  1. 獲得一張新表[(A1, B1, C1 - C1_), (A2, B2, C2 - C2_),...(AN, BN, CN - CN_)]
  2. 從那裏,創建一個列表 僅由[ C1 - C1_,C2 - C2 _,...]

我敢說,Numpy會允許我這樣做,但是我仍然沒有挖掘出如何對元組中的一個元素進行操作,所以我會很感激任何可能的幫助。 謝謝。

+0

瞭解如何使用[list解析](http://docs.python.org/2/tutorial/datastructures.html #list-comprehensions)和['zip'](http://docs.python.org/2/library/functions.html#zip)函數。 –

+1

而你沒有列表的列表,而是元組列表。 –

回答

0

沒有numpy的:

>>> x = [(1,2,3), (4,5,6), (7,8,9)] 
>>> y = [(10,20,30), (40,50,60), (70,80,90)] 
>>> [ (a[0], a[1], a[2] - b[2]) for a, b in zip(x, y) ] 
[(1, 2, -27), (4, 5, -54), (7, 8, -81)] 
>>> [ a[2] - b[2] for a, b in zip(x, y) ] 
[-27, -54, -81] 
3

如果你開始xy是一個元組列表,那麼很容易將它們轉換爲2D與NumPy陣列:

import numpy as np 

x = np.array([(1,2,3), (4,5,6), (7,8,9)]) 
y = np.array([(10,20,30), (40,50,60), (70,80,90)]) 

然後創建一個陣列類似

[(A1, B1, C1 - C1_), (A2, B2, C2 - C2_),...(AN, BN, CN - CN_)] 

你可以這樣做:

z = x[:]   # make a copy of array x 
z[:,2] -= y[:,2] # subtract the 3rd column of y from z 

print(z) 

產量

[[ 1 2 -27] 
[ 4 5 -54] 
[ 7 8 -81]] 

,並獲得

[C1 - C1_, C2 - C2_,...] 

,你既可以使用z[:, 2]或直接從xy獲得其使用x[:, 2] - y[:, 2]

[-27 -54 -81] 

我可能是misunderstandi你的問題,但是當你說「我仍然沒有挖掘出如何只對元組中的一個元素進行操作」,這讓我覺得你可能會將元組存儲在NumPy數組中。如果這是真的,那麼我會敦促你重新考慮你使用NumPy的方式:

你會發現,當你使用dtype=object把Python對象存儲在一個NumPy數組(如一個元組)中時,這些對象最終涉及對Python函數的調用,而不是NumPy通常調用的更快的C/Fortran編譯函數。

因此,雖然您可能喜歡NumPy語法來選擇數組中的項目,但您不會獲得比純Python對象更高的速度優勢。實際上,它可能比使用純Python對象(如元組列表)慢。

由於這個原因,我建議避免在NumPy數組中存儲Python對象,特別是當這些對象是數值時,因爲NumPy的本地數值型dty服務更好。

而不是將三元組存儲在數組中,最好爲NumPy數組添加一個額外的維(一個所謂的「軸」),並沿這個軸存儲3個組件。

一旦你這樣做了,你考慮的數值計算就是小菜一碟。它可以用像做:

x[:,2]-y[:,2] 
相關問題