【问题标题】:Python - Subtracting elements in lists of tuplesPython - 减去元组列表中的元素
【发布时间】:2014-01-09 21:05:41
【问题描述】:

我有两个元组列表。

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 中的某些东西可以让我做到这一点,但我仍然没有找到如何只对元组中的一个元素进行操作,所以我将不胜感激任何可能的帮助。 谢谢。

【问题讨论】:

标签: list python-3.x numpy


【解决方案1】:

如果您以 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 将 Python 对象存储在 NumPy 数组(例如元组)中时,对这些对象执行的所有操作最终都涉及对 Python 函数的调用,而不是更快的 C/Fortran 编译函数NumPy 通常调用的。

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

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

与其将 3 元组存储在数组中,不如在 NumPy 数组中添加一个额外的维度(所谓的“轴”)并沿该轴存储 3 个分量。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 2021-10-18
      • 2019-01-08
      • 1970-01-01
      相关资源
      最近更新 更多