2014-01-09 52 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] 
相关问题