Python - 在元组列表中减去元素

时间:2014-01-09 21:05:41

标签: list python-3.x numpy

我有两个元组列表。

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 _,...]
  3. 组成

    我冒昧地说,Numpy中的某些内容可以让我这样做,但我仍然没有挖出如何只对元组中的一个元素进行操作,所以我会感激任何可能的帮助。 感谢。

2 个答案:

答案 0 :(得分: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]

我可能会误解你的问题,但当你说“我仍然没有挖出如何在元组中的一个元素上进行操作”时,它会让我觉得你可能正在存储元组在NumPy数组中。如果这是真的,那么我建议你重新考虑使用NumPy的方式:

你看,当你使用dtype=object在NumPy数组(例如元组)中存储Python对象时,对这些对象进行的所有操作最终都涉及对Python函数的调用,而不是更快的C / Fortran NumPy通常调用的编译函数。

因此,虽然您可能喜欢使用NumPy语法来选择数组中的项目,但与普通Python对象相比,您没有获得任何速度优势。实际上,它可能比使用普通Python对象(例如元组列表)慢。

出于这个原因,我建议尽可能避免将Python对象存储在NumPy数组中,特别是当这些对象是数字时,因为NumPy的本机数字dtypes服务得更好。

不是在数组中存储3元组,最好在NumPy数组中添加一个额外的维度(所谓的“轴”),并沿着这个轴存储3个组件。

一旦你这样做,你想到的数值计算就是小菜一碟。可以通过以下方式完成:

x[:,2]-y[:,2]

答案 1 :(得分:1)

没有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]